You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ma...@apache.org on 2013/10/02 03:01:15 UTC

[4/5] git commit: [flex-sdk] [refs/heads/mobileexperimental] - https://issues.apache.org/jira/browse/FLEX-33777 Dagrid for mobile - Manages column with percent widths - Simplified class structure, removing intermediary classes - Completed all ASDOC - Opt

https://issues.apache.org/jira/browse/FLEX-33777 Dagrid for mobile
- Manages column with percent widths
- Simplified class structure, removing intermediary classes
- Completed all ASDOC
- Optimized layout calculations


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

Branch: refs/heads/mobileexperimental
Commit: 448266071533e134113d21c6e5296543753c150b
Parents: fe39973
Author: mamsellem <ma...@systar.com>
Authored: Wed Oct 2 02:47:00 2013 +0200
Committer: mamsellem <ma...@systar.com>
Committed: Wed Oct 2 02:47:00 2013 +0200

----------------------------------------------------------------------
 .../src/ExperimentalMobileClasses.as            |   2 +-
 .../src/spark/components/MobileGrid.as          |  29 +-
 .../itemRenderers/IItemPartRendererBase.as      |  10 +-
 .../itemRenderers/IItemTextPartRenderer.as      |  10 +-
 .../itemRenderers/ItemBitmapPartRenderer.as     |  15 +-
 .../itemRenderers/ItemTextPartRenderer.as       |   9 +-
 .../supportClasses/ItemRendererBase.as          |  34 +--
 .../supportClasses/ListMultiPartColumnLayout.as | 135 ++++++++--
 .../ListMultiPartItemRendererBase.as            | 267 -------------------
 .../supportClasses/ListMultiPartLayoutBase.as   | 148 ----------
 .../supportClasses/MobileGridColumn.as          | 249 +++++++++++++++--
 .../supportClasses/MobileGridHeader.as          |  39 ++-
 .../supportClasses/MobileGridRowRenderer.as     | 234 +++++++++++++++-
 .../PartRendererDescriptorBase.as               | 189 -------------
 .../src/spark/events/MobileGridHeaderEvent.as   |   2 +-
 .../src/spark/layouts/MobileGridLayout.as       |  95 +++++++
 .../src/spark/utils/DensityUtil2.as             |  16 +-
 .../src/spark/utils/MultiDPIBitmapSourceExt.as  |  12 +-
 .../src/spark/utils/UIComponentUtils.as         |   8 +-
 19 files changed, 771 insertions(+), 732 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/ExperimentalMobileClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/ExperimentalMobileClasses.as b/frameworks/projects/experimental_mobile/src/ExperimentalMobileClasses.as
index b695712..8cb1081 100644
--- a/frameworks/projects/experimental_mobile/src/ExperimentalMobileClasses.as
+++ b/frameworks/projects/experimental_mobile/src/ExperimentalMobileClasses.as
@@ -25,7 +25,7 @@ import spark.skins.MobileGridSkin;
 
 /*
  classes that won't be detected through dependencies
- * and classes that needs to be includes in ASDOC
+ * and root classes that needs to be includes in ASDOC
  * */
 
 internal class ExperimentalMobileClasses

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/MobileGrid.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/MobileGrid.as b/frameworks/projects/experimental_mobile/src/spark/components/MobileGrid.as
index 4161580..39977d7 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/MobileGrid.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/MobileGrid.as
@@ -30,8 +30,8 @@ import spark.collections.Sort;
 import spark.components.supportClasses.MobileGridColumn;
 import spark.components.supportClasses.MobileGridHeader;
 import spark.components.supportClasses.MobileGridRowRenderer;
-import spark.components.supportClasses.PartRendererDescriptorBase;
 import spark.events.MobileGridHeaderEvent;
+import spark.layouts.MobileGridLayout;
 import spark.layouts.VerticalLayout;
 import spark.layouts.supportClasses.LayoutBase;
 
@@ -41,18 +41,10 @@ use namespace  mx_internal;
  *  Dispatched when the user releases the mouse button on a column header
  *  to request the control to sort  the grid contents based on the contents of the column.
  *  Only dispatched if the column is sortable and the data provider supports
- *  sorting. The DataGrid control has a default handler for this event that implements
- *  a single-column sort.
- * <b>Note</b>: The sort arrows are defined by the default event handler for
- * the headerRelease event. If you call the <code>preventDefault()</code> method
- * in your event handler, the arrows are not drawn.
- * </p>
+ *  sorting.
  *
- *  @eventType mx.events.DataGridEvent.HEADER_RELEASE
+ *  @eventType spark.events.MobileGridHeaderEvent
  *
- *  @langversion 3.0
- *  @playerversion AIR 3.8
- *  @productversion Flex 4.11
  */
 [Event(name="sortChange", type="spark.events.MobileGridHeaderEvent")]
 
@@ -118,10 +110,6 @@ public class MobileGrid extends List
      *
      *  @see   spark.components.supportClasses.MobileGridColumn
      *
-     *  @langversion 3.0
-     *  @playerversion Flash 9
-     *  @playerversion AIR 1.1
-     *  @productversion Flex 3
      */
     [Inspectable(arrayType="spark.components.supportClasses.MobileGridColumn")]
     public function set columns(value:Array):void
@@ -156,10 +144,7 @@ public class MobileGrid extends List
      *  @default true
      *
      *  @see spark.components.supportClasses.MobileGridColumn#sortable
-     *
-     *  @langversion 3.0
-     *  @playerversion AIR 3.8
-     *  @productversion Flex 4.11
+
      */
     public function get sortableColumns():Boolean
     {
@@ -190,18 +175,18 @@ public class MobileGrid extends List
     /* default layout for row item renderers */
     protected function getDefaultLayout():LayoutBase
     {
-        var l:VerticalLayout = new VerticalLayout();
+        var l:VerticalLayout = new MobileGridLayout(this);
         l.horizontalAlign = "contentJustify";
         l.gap = 0;
         return l;
     }
 
-    protected function initDefaultItemRenderer(pcolumnDescriptors:Array):void
+    protected function initDefaultItemRenderer(pcolumns:Array):void
     {
         var cf:ClassFactory;
         cf = new ClassFactory(MobileGridRowRenderer);
         cf.properties = {
-            partRendererDescriptors: Vector.<PartRendererDescriptorBase>(pcolumnDescriptors)
+            columns: Vector.<MobileGridColumn>(pcolumns)
         };
         this.itemRenderer = cf;
     }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemPartRendererBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemPartRendererBase.as b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemPartRendererBase.as
index ab802f3..37ca652 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemPartRendererBase.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemPartRendererBase.as
@@ -24,6 +24,12 @@ import mx.styles.IStyleClient;
 
 /**
  * This is the base interface that all mobile cell or other mobile item part renderers must implement.
+ * Contrary to desktop DataGrid control, there is no default base renderer,
+ * because mobile renderers must be lightweight, and derive directly for the existing component, (ie. s:Button or s:CheckBox ).
+ *
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
  */
 public interface IItemPartRendererBase extends IDataRenderer
 {
@@ -34,9 +40,9 @@ public interface IItemPartRendererBase extends IDataRenderer
      */
     function set styleProvider(value:IStyleClient):void ;
 
-    function get canSetWidth():Boolean;
+    function get canSetContentWidth():Boolean;
 
-    function get canSetHeight():Boolean;
+    function get canSetContentHeight():Boolean;
 
     /**
      * @private

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemTextPartRenderer.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemTextPartRenderer.as b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemTextPartRenderer.as
index edcc0f9..90ca694 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemTextPartRenderer.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/IItemTextPartRenderer.as
@@ -19,13 +19,21 @@
 package spark.components.itemRenderers
 {
 
+/**  Extended interface for renderer that include text
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ */
+
 public interface IItemTextPartRenderer extends IItemPartRendererBase
 {
-
+    /* implement this property so that the renderer can receive the dataField from the renderer's MobileGridColumn*/
     function set labelField(value:String):void;
 
+    /* implement this property so that the renderer can receive the labelFunction from the renderers' MobileGridColumn*/
     function set labelFunction(value:Function):void;
 
+    /* implement this property so that the renderer can receive the textAlign property from the renderers' MobileGridColumn*/
     function set textAlign(textAlign:String):void;
 }
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemBitmapPartRenderer.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemBitmapPartRenderer.as b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemBitmapPartRenderer.as
index c95195b..29db838 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemBitmapPartRenderer.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemBitmapPartRenderer.as
@@ -28,7 +28,12 @@ import spark.primitives.BitmapImage;
 use namespace mx_internal;
 
 /** Default lightweight  class for rendering embedded Bitmaps  or Multi-DPI Bitmaps in a MobileGrid cell .
- * <p> You define the icon to be used in each cell by setting either iconField or iconFunction properties.  </p>
+ *You define the icon to be used in each cell by setting either iconField or iconFunction properties.
+ *
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ *
  *  */
 public class ItemBitmapPartRenderer extends BitmapImage implements IItemPartRendererBase
 {
@@ -45,12 +50,12 @@ public class ItemBitmapPartRenderer extends BitmapImage implements IItemPartRend
 
     /**
      *  The name of the field or property in the DataGrid's dataProvider item that defines the icon to display for this renderer's column.
-     *  <p> The fields value must be either an embedded bitmap's class, or or MultiBitmapSourceExt object.   </p>
+     *  <p> The field value must be either an embedded bitmap's class, or or MultiBitmapSource object.   </p>
      *   <p> If not set, then iconFunction will be used.  </p>
      *  @default null
      *
      *  @see #iconFunction
-     *  @see  spark.utils.MultiDPIBitmapSourceExt
+     *  @see  spark.utils.MultiDPIBitmapSource
      *
      */
     public function get iconField():String
@@ -115,12 +120,12 @@ public class ItemBitmapPartRenderer extends BitmapImage implements IItemPartRend
 
     /* to avoid any scaling artifacts, we do not allow bitmap to be stretcghed */
 
-    public function get canSetWidth():Boolean
+    public function get canSetContentWidth():Boolean
     {
         return false;
     }
 
-    public function get canSetHeight():Boolean
+    public function get canSetContentHeight():Boolean
     {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemTextPartRenderer.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemTextPartRenderer.as b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemTextPartRenderer.as
index ca3f542..2ad7118 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemTextPartRenderer.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/itemRenderers/ItemTextPartRenderer.as
@@ -31,6 +31,11 @@ use namespace mx_internal;
 
 /** Default lightweight  class for rendering formatted text in MobileGrid cells .
  * <p> You don't have to use this render explicitly as it will be used by default for MobileGrid text cells. </p>
+ *
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ *
  *  */
 public class ItemTextPartRenderer extends StyleableTextField implements IItemTextPartRenderer
 {
@@ -92,12 +97,12 @@ public class ItemTextPartRenderer extends StyleableTextField implements IItemTex
         _labelFunction = value;
     }
 
-    public function get canSetWidth():Boolean
+    public function get canSetContentWidth():Boolean
     {
         return true;
     }
 
-    public function get canSetHeight():Boolean
+    public function get canSetContentHeight():Boolean
     {
         return false;
     }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ItemRendererBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ItemRendererBase.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ItemRendererBase.as
index cf54c6e..a91d389 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ItemRendererBase.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ItemRendererBase.as
@@ -20,8 +20,13 @@
 /**  @private
  *  monkey-patched  from LabelItemRenderer, pruned from label/labelDisplay  and change some variable accessibility
  *  Provides default behavior for  ListMultiPartItemRenderer
- *  Eventually should  become superclass of LabelItemRenderer
+ *
+ *   @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ *
  *  */
+//TODO refactoring : should  become superclass of LabelItemRenderer
 
 package spark.components.supportClasses
 {
@@ -57,9 +62,6 @@ use namespace mx_internal;
  *
  *  @eventType mx.events.FlexEvent.DATA_CHANGE
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Event(name="dataChange", type="mx.events.FlexEvent")]
 
@@ -72,9 +74,6 @@ use namespace mx_internal;
 /**
  *  @copy spark.components.supportClasses.GroupBase#style:alternatingItemColors
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="alternatingItemColors", type="Array", arrayType="uint", format="Color", inherit="yes", theme="spark, mobile")]
 
@@ -83,27 +82,18 @@ use namespace mx_internal;
  *
  *  @default 0xCCCCCC
  *
- *  @langversion 3.0
- *  @playerversion AIR 1.5
- *  @productversion Flex 4
  */
 [Style(name="chromeColor", type="uint", format="Color", inherit="yes", theme="spark, mobile")]
 
 /**
  *  @copy spark.components.supportClasses.GroupBase#style:downColor
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="downColor", type="uint", format="Color", inherit="yes", theme="spark, mobile")]
 
 /**
  *  @copy spark.components.supportClasses.GroupBase#style:focusColor
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="focusColor", type="uint", format="Color", inherit="yes", theme="spark, mobile")]
 
@@ -113,9 +103,6 @@ use namespace mx_internal;
  *
  *  @default 5
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="paddingBottom", type="Number", format="Length", inherit="no")]
 
@@ -125,27 +112,18 @@ use namespace mx_internal;
  *
  *  @default 5
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="paddingTop", type="Number", format="Length", inherit="no")]
 
 /**
  *  @copy spark.components.supportClasses.GroupBase#style:rollOverColor
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="rollOverColor", type="uint", format="Color", inherit="yes")]
 
 /**
  *  @copy spark.components.List#style:selectionColor
  *
- *  @langversion 3.0
- *  @playerversion AIR 2.5
- *  @productversion Flex 4.5
  */
 [Style(name="selectionColor", type="uint", format="Color", inherit="yes")]
 

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartColumnLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartColumnLayout.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartColumnLayout.as
index 44c2c46..8cd7e27 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartColumnLayout.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartColumnLayout.as
@@ -18,9 +18,12 @@
 ////////////////////////////////////////////////////////////////////////////////
 package spark.components.supportClasses
 {
+import mx.core.IFlexDisplayObject;
+import mx.core.ILayoutElement;
 import mx.core.mx_internal;
 
 import spark.components.itemRenderers.IItemPartRendererBase;
+import spark.core.IGraphicElement;
 import spark.utils.UIComponentUtils;
 
 use namespace  mx_internal;
@@ -29,29 +32,45 @@ use namespace  mx_internal;
  *    this class is responsible for laying out grid cells in a given MobileGrid row.
  *    It will make sure that cell content is aligned according to the column widths.
  */
-public class ListMultiPartColumnLayout extends ListMultiPartLayoutBase
+public class ListMultiPartColumnLayout extends Object
 {
+    public function ListMultiPartColumnLayout(target:MobileGridRowRenderer)
+    {
+        _target = target;
+    }
 
-    public function ListMultiPartColumnLayout(target:ListMultiPartItemRendererBase)
+    private var _target:MobileGridRowRenderer;
+
+    public function get target():MobileGridRowRenderer
     {
-        super(target);
+        return _target;
     }
 
-    override public function measure():void
+    protected function get partRendererDescriptors():Vector.<MobileGridColumn>
     {
-        super.measure();
-        var totalWidth:Number = 0;
-        for each (var ld:PartRendererDescriptorBase in partRendererDescriptors)
-        {
-            totalWidth += ld.dpiScaledWidth;
-        }
-        target.measuredWidth = totalWidth;
-        target.measuredMinWidth = 50;
+        return target.columns;
+    }
+
+    protected function get graphicElementPartRenderers():Vector.<IGraphicElement>
+    {
+        return target.graphicElementPartRenderers;
+    }
+
+    protected function get partRenderers():Vector.<IItemPartRendererBase>
+    {
+        return target.partRenderers;
+    }
+
+    public function measure():void
+    {
+
     }
 
+
     /* vertical align middle
      * Layout algorithm:   give all columns the requested sizes, and the last column the remaining width  */
-    override public function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
+
+    public function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
     {
 
         if (unscaledWidth == 0 && unscaledHeight == 0)
@@ -62,9 +81,8 @@ public class ListMultiPartColumnLayout extends ListMultiPartLayoutBase
         var paddingBottom:Number = target.getStyle("paddingBottom");
         var cellHeight:Number = unscaledHeight - paddingTop - paddingBottom;
 
-        var desc:PartRendererDescriptorBase;
+        var desc:MobileGridColumn;
         var dpr:IItemPartRendererBase;
-        var remainingWidth:Number = unscaledWidth;
         var curX:Number = cellPaddingLeft;
         var curY:Number = paddingTop;
         var colWidth:Number;
@@ -75,23 +93,98 @@ public class ListMultiPartColumnLayout extends ListMultiPartLayoutBase
         {
             dpr = partRenderers[i];
             desc = partRendererDescriptors[i];
-            colWidth = desc.dpiScaledWidth;
-            if (dpr.canSetWidth)
+            colWidth = desc.actualWidth;
+            if (dpr.canSetContentWidth)
             {
                 // expand last column to fill width, unless it has explicity width
-                partWidth = Math.max(0, ( i == count && !desc.hasExplicitWidth) ? remainingWidth : colWidth - cellPaddingLeft - cellPaddingRight);
+                partWidth = Math.max(0, colWidth - cellPaddingLeft - cellPaddingRight);
             }
             else
             {
                 partWidth = dpr.getPreferredBoundsHeight();
             }
-            partHeight = dpr.canSetHeight ? cellHeight : dpr.getPreferredBoundsHeight();
-            ;
+            partHeight = dpr.canSetContentHeight ? cellHeight : dpr.getPreferredBoundsHeight();
             setElementSize(dpr, partWidth, partHeight);
             setElementPosition(dpr, curX, curY + UIComponentUtils.offsetForCenter(partHeight, cellHeight));
             curX += colWidth;
-            remainingWidth -= colWidth;
         }
     }
+
+
+    /* layout helper  methods */
+
+    protected function setElementPosition(element:Object, x:Number, y:Number):void
+    {
+        if (element is ILayoutElement)
+        {
+            ILayoutElement(element).setLayoutBoundsPosition(x, y, false);
+        }
+        else if (element is IFlexDisplayObject)
+        {
+            IFlexDisplayObject(element).move(x, y);
+        }
+        else
+        {
+            element.x = x;
+            element.y = y;
+        }
+    }
+
+    protected function setElementSize(element:Object, width:Number, height:Number):void
+    {
+        if (element is ILayoutElement)
+        {
+            ILayoutElement(element).setLayoutBoundsSize(width, height, false);
+        }
+        else if (element is IFlexDisplayObject)
+        {
+            IFlexDisplayObject(element).setActualSize(width, height);
+        }
+        else
+        {
+            element.width = width;
+            element.height = height;
+        }
+    }
+
+    protected function getElementPreferredWidth(element:Object):Number
+    {
+        var result:Number;
+
+        if (element is ILayoutElement)
+        {
+            result = ILayoutElement(element).getPreferredBoundsWidth();
+        }
+        else if (element is IFlexDisplayObject)
+        {
+            result = IFlexDisplayObject(element).measuredWidth;
+        }
+        else
+        {
+            result = element.width;
+        }
+
+        return Math.round(result);
+    }
+
+    protected function getElementPreferredHeight(element:Object):Number
+    {
+        var result:Number;
+
+        if (element is ILayoutElement)
+        {
+            result = ILayoutElement(element).getPreferredBoundsHeight();
+        }
+        else if (element is IFlexDisplayObject)
+        {
+            result = IFlexDisplayObject(element).measuredHeight;
+        }
+        else
+        {
+            result = element.height;
+        }
+
+        return Math.ceil(result);
+    }
 }
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartItemRendererBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartItemRendererBase.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartItemRendererBase.as
deleted file mode 100644
index 8f07d5c..0000000
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartItemRendererBase.as
+++ /dev/null
@@ -1,267 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  Licensed to the Apache Software Foundation (ASF) under one or more
-//  contributor license agreements.  See the NOTICE file distributed with
-//  this work for additional information regarding copyright ownership.
-//  The ASF licenses this file to You under the Apache License, Version 2.0
-//  (the "License"); you may not use this file except in compliance with
-//  the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-package spark.components.supportClasses
-{
-import flash.display.DisplayObject;
-
-import spark.components.itemRenderers.IItemPartRendererBase;
-import spark.core.DisplayObjectSharingMode;
-import spark.core.IGraphicElement;
-import spark.core.IGraphicElementContainer;
-import spark.core.ISharedDisplayObject;
-
-/**  @private
- *  This is the base class for multi-part renderers that manages a vector of part renderers.
- *  This class is responsible for creating and storing  the actual renderers from their descriptors
- *  the layout of the part renderers is delegated to a subclass of ListMultiPartLayoutBase;
- */
-public class ListMultiPartItemRendererBase extends ItemRendererBase implements IGraphicElementContainer, ISharedDisplayObject
-{
-    private var _partRendererDescriptors:Vector.<PartRendererDescriptorBase>;
-    private var _partRenderers:Vector.<IItemPartRendererBase>;
-    private var _graphicElementPartRenderers:Vector.<IGraphicElement>;
-    private var _partRenderersLayout:ListMultiPartLayoutBase;
-
-    /**
-     * Management of graphicElement part renderers  lifeCycle
-     */
-    private var _redrawRequested:Boolean = false;
-    private var graphicElementsNeedValidateProperties:Boolean = false;
-    private var graphicElementsNeedValidateSize:Boolean = false;
-
-    public function ListMultiPartItemRendererBase()
-    {
-    }
-
-    /** @private
-     * set in List itemRenderer Factory properties */
-    public function set partRendererDescriptors(value:Vector.<PartRendererDescriptorBase>):void
-    {
-        _partRendererDescriptors = value;
-        _partRenderers = new Vector.<IItemPartRendererBase>(_partRendererDescriptors.length, true);
-        _graphicElementPartRenderers = new Vector.<IGraphicElement>();
-    }
-
-    public function get partRendererDescriptors():Vector.<PartRendererDescriptorBase>
-    {
-        return _partRendererDescriptors;
-    }
-
-    public function get partRenderersLayout():ListMultiPartLayoutBase
-    {
-        return _partRenderersLayout;
-    }
-
-    public function set partRenderersLayout(value:ListMultiPartLayoutBase):void
-    {
-        _partRenderersLayout = value;
-    }
-
-    public function get partRenderers():Vector.<IItemPartRendererBase>
-    {
-        return _partRenderers;
-    }
-
-    public function get graphicElementPartRenderers():Vector.<IGraphicElement>
-    {
-        return _graphicElementPartRenderers;
-    }
-
-    override protected function createChildren():void
-    {
-        super.createChildren();
-        var desc:PartRendererDescriptorBase;
-        var pr:IItemPartRendererBase;
-        var ge:IGraphicElement;
-        for (var i:int = 0; i < _partRendererDescriptors.length; i++)
-        {
-            desc = _partRendererDescriptors[i];
-            pr = desc.createPartRenderer();
-            if (pr != null)
-            {
-                pr.styleProvider = this;
-
-                if (pr is IGraphicElement)
-                {
-                    ge = IGraphicElement(pr);
-                    ge.parentChanged(this);
-                    if (ge.setSharedDisplayObject(this))
-                    {
-                        ge.displayObjectSharingMode = DisplayObjectSharingMode.USES_SHARED_OBJECT;
-                    }
-                    _graphicElementPartRenderers.push(ge);
-                }
-                else if (pr is DisplayObject)
-                {
-                    addChild(DisplayObject(pr));
-                }
-                _partRenderers[i] = pr;
-            }
-            else
-            {
-                //TODO move to resource bundle
-                throw  new Error("MobileGridColumn item renderer must implement spark.components.itemRenderers.IItemPartRendererBase");
-            }
-        }
-    }
-
-    override protected function measure():void
-    {
-        super.measure();
-        _partRenderersLayout.measure();
-    }
-
-    /** delegate children layout to its partRendererLayout
-     subclasses can override this method to layout chrome content
-     */
-    override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
-    {
-        _partRenderersLayout.layoutContents(unscaledWidth, unscaledHeight);
-    }
-
-    override protected function onDataChanged():void
-    {
-        var dpr:IItemPartRendererBase;
-        for (var i:int = 0; i < _partRenderers.length; i++)
-        {
-            dpr = _partRenderers[i];
-            dpr.data = data;
-        }
-        invalidateSize();
-    }
-
-    /*  graphic element sub renderers lifecycle management */
-
-    override protected function commitProperties():void
-    {
-        if (graphicElementsNeedValidateProperties)
-        {
-            graphicElementsNeedValidateProperties = false;
-            for (var i:int = 0; i < _graphicElementPartRenderers.length; i++)
-            {
-                _graphicElementPartRenderers[i].validateProperties();
-            }
-        }
-        super.commitProperties();
-    }
-
-
-    override public function validateSize(recursive:Boolean = false):void
-    {
-        if (graphicElementsNeedValidateSize)
-        {
-            graphicElementsNeedValidateSize = false;
-            for (var i:int = 0; i < _graphicElementPartRenderers.length; i++)
-            {
-                _graphicElementPartRenderers[i].validateSize();
-            }
-        }
-        super.validateSize(recursive);
-    }
-
-
-    /* copied from Group*/
-    override public function validateDisplayList():void
-    {
-        super.validateDisplayList();
-        if (_redrawRequested)
-        {
-            for (var i:int = 0; i < _graphicElementPartRenderers.length; i++)
-            {
-                _graphicElementPartRenderers[i].validateDisplayList();
-            }
-        }
-    }
-
-    /* interfaces implementation, copied from spark.components.IconItemRender  */
-
-    /**
-     *  @inheritDoc
-     *
-     *  <p>We implement this as part of ISharedDisplayObject so the iconDisplay
-     *  can share our display object.</p>
-     *
-     *  @langversion 3.0
-     *  @playerversion AIR 1.5
-     *  @productversion Flex 4
-     */
-    public function get redrawRequested():Boolean
-    {
-        return _redrawRequested;
-    }
-
-    /**
-     *  @private
-     */
-    public function set redrawRequested(value:Boolean):void
-    {
-        _redrawRequested = value;
-    }
-
-    //--------------------------------------------------------------------------
-    //
-    //  IGraphicElementContainer
-    //
-    // -------------------------------------------------------------------------
-
-    /**
-     * @private
-     *
-     *  Notify the host component that an element changed and needs to validate properties.
-     */
-    public function invalidateGraphicElementSharing(element:IGraphicElement):void
-    {
-        //do nothing because all has been done in createChildren and won't change
-    }
-
-    /**
-     * @private
-     *
-     *  Notify the host component that an element changed and needs to validate properties.
-     */
-    public function invalidateGraphicElementProperties(element:IGraphicElement):void
-    {
-        graphicElementsNeedValidateProperties = true;
-        invalidateProperties();
-    }
-
-    /**
-     * @private
-     */
-    public function invalidateGraphicElementSize(element:IGraphicElement):void
-    {
-        graphicElementsNeedValidateSize = true;
-        invalidateSize();
-    }
-
-    /**
-     * @private
-     *
-     */
-    public function invalidateGraphicElementDisplayList(element:IGraphicElement):void
-    {
-        if (element.displayObject is ISharedDisplayObject)
-            ISharedDisplayObject(element.displayObject).redrawRequested = true;
-        invalidateDisplayList();
-    }
-
-
-}
-
-}

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartLayoutBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartLayoutBase.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartLayoutBase.as
deleted file mode 100644
index 21593b1..0000000
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/ListMultiPartLayoutBase.as
+++ /dev/null
@@ -1,148 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  Licensed to the Apache Software Foundation (ASF) under one or more
-//  contributor license agreements.  See the NOTICE file distributed with
-//  this work for additional information regarding copyright ownership.
-//  The ASF licenses this file to You under the Apache License, Version 2.0
-//  (the "License"); you may not use this file except in compliance with
-//  the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-package spark.components.supportClasses
-{
-import mx.core.IFlexDisplayObject;
-import mx.core.ILayoutElement;
-
-import spark.components.itemRenderers.IItemPartRendererBase;
-import spark.core.IGraphicElement;
-
-/** @private
- *   Abstract base class for laying out part renderers in a multi-part renderer.
- *   Subclasses must override measure() and layoutContents() methods
- */
-public class ListMultiPartLayoutBase extends Object
-{
-    private var _target:ListMultiPartItemRendererBase;
-
-    public function ListMultiPartLayoutBase(target:ListMultiPartItemRendererBase)
-    {
-        _target = target;
-    }
-
-    public function get target():ListMultiPartItemRendererBase
-    {
-        return _target;
-    }
-
-    protected function get partRendererDescriptors():Vector.<PartRendererDescriptorBase>
-    {
-        return target.partRendererDescriptors;
-    }
-
-    protected function get graphicElementPartRenderers():Vector.<IGraphicElement>
-    {
-        return target.graphicElementPartRenderers;
-    }
-
-
-    protected function get partRenderers():Vector.<IItemPartRendererBase>
-    {
-        return target.partRenderers;
-    }
-
-    public function measure():void
-    {
-
-    }
-
-    /* vertical align middle
-     * give all columns the requested sizes, and the last column the remaining width  */
-    public function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
-    {
-
-    }
-
-    protected function setElementPosition(element:Object, x:Number, y:Number):void
-    {
-        if (element is ILayoutElement)
-        {
-            ILayoutElement(element).setLayoutBoundsPosition(x, y, false);
-        }
-        else if (element is IFlexDisplayObject)
-        {
-            IFlexDisplayObject(element).move(x, y);
-        }
-        else
-        {
-            element.x = x;
-            element.y = y;
-        }
-    }
-
-    protected function setElementSize(element:Object, width:Number, height:Number):void
-    {
-        if (element is ILayoutElement)
-        {
-            ILayoutElement(element).setLayoutBoundsSize(width, height, false);
-        }
-        else if (element is IFlexDisplayObject)
-        {
-            IFlexDisplayObject(element).setActualSize(width, height);
-        }
-        else
-        {
-            element.width = width;
-            element.height = height;
-        }
-    }
-
-    protected function getElementPreferredWidth(element:Object):Number
-    {
-        var result:Number;
-
-        if (element is ILayoutElement)
-        {
-            result = ILayoutElement(element).getPreferredBoundsWidth();
-        }
-        else if (element is IFlexDisplayObject)
-        {
-            result = IFlexDisplayObject(element).measuredWidth;
-        }
-        else
-        {
-            result = element.width;
-        }
-
-        return Math.round(result);
-    }
-
-    protected function getElementPreferredHeight(element:Object):Number
-    {
-        var result:Number;
-
-        if (element is ILayoutElement)
-        {
-            result = ILayoutElement(element).getPreferredBoundsHeight();
-        }
-        else if (element is IFlexDisplayObject)
-        {
-            result = IFlexDisplayObject(element).measuredHeight;
-        }
-        else
-        {
-            result = element.height;
-        }
-
-        return Math.ceil(result);
-    }
-
-}
-}

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridColumn.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridColumn.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridColumn.as
index 9c49428..b7508f1 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridColumn.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridColumn.as
@@ -19,11 +19,18 @@
 package spark.components.supportClasses
 {
 
+import flash.events.EventDispatcher;
 import flash.events.IEventDispatcher;
 
+import mx.core.ClassFactory;
+import mx.core.IFactory;
+import mx.core.mx_internal;
 import mx.utils.ObjectUtil;
 
 import spark.collections.SortField;
+import spark.components.itemRenderers.IItemPartRendererBase;
+import spark.components.itemRenderers.IItemTextPartRenderer;
+import spark.components.itemRenderers.ItemTextPartRenderer;
 
 /**
  *  The MobileGridColumn class defines  a column to display in a MobileGrid control.
@@ -36,28 +43,201 @@ import spark.collections.SortField;
  *  </ul>
  *
  *  @see spark.components.MobileGrid
- *  @see spark.components.supportClasses.PartRendererDescriptorBase
  *
  *  @langversion 3.0
  *  @playerversion AIR 3.8
  *  @productversion Flex 4.11
  */
-public class MobileGridColumn extends PartRendererDescriptorBase
-{
-
-    private var _headerText:String = null;
-    private var _headerStyleName:String;
-    private var _sortDescending:Boolean;
-    private var _sortable:Boolean = true;
+public class MobileGridColumn extends EventDispatcher
 
+{
     public function MobileGridColumn(target:IEventDispatcher = null)
     {
         super(target);
+        _labelFunction = null;
+        itemRenderer = null; // will set default ;
         labelFunction = null;
-        setWidth(100); // default width;
         itemRenderer = null; // will set default ;
     }
 
+    private var _dataField:String;
+
+    /**
+     *  The name of the field or property in the data provider item associated
+     *  with the column.
+     *  Each GridColumn requires this property or
+     *  the <code>labelFunction</code> property to be set
+     *  to calculate the displayable text for the item renderer.
+     *  If the <code>dataField</code>
+     *  and <code>labelFunction</code> properties are set,
+     *  the data is displayed using the <code>labelFunction</code> and sorted
+     *  using the <code>dataField</code>.
+
+     *  <p>If the column or its grid specifies a <code>labelFunction</code>,
+     *  then the dataField is not used.</p>
+     *
+     *  @default null
+     *
+     *  @see #labelFunction
+     *
+     */
+    public function get dataField():String
+    {
+        return _dataField;
+    }
+
+    public function set dataField(value:String):void
+    {
+        _dataField = value;
+    }
+
+    /* internal vars */
+
+    private var _width:Number = NaN;
+
+
+    /** Set the desired width for this column.
+     * <p> Width value is expressed in current applicationDPI, or at 160 DPI  if applicationDPI is not set.
+     * The default value is 100.
+     *
+     *  <p>Note: You can specify a percentage value in the MXML
+     *  <code>width</code> attribute, such as <code>width="50%"</code>,
+     *  but you cannot use a percentage value in the <code>width</code>
+     *  property in ActionScript.
+     *  Use the <code>percentWidth</code> property instead.</p>
+     *
+     *  @see #percentWidth
+     *
+     * @default 100
+     */
+    public function get width():Number
+    {
+        return _width;
+    }
+
+    [PercentProxy("percentWidth")]
+    public function set width(value:Number):void
+    {
+        _width = value;
+    }
+
+    private var _percentWidth:Number = NaN;
+
+    /**
+     *  Specifies the width of this column as a percentage of the grid's width. Allowed values are 0-100. The default value is NaN.
+     *  If set, this property has precedence over the fixed width property.
+     *
+     *  <p> MobileGrid will compute the column widths as follows:
+     *  <ul>
+     *      <li> First, honor all columns with fixed widths.  Columns with no width or percentWidth receive a width of 100.</li>
+     *      <li> Then distribute the remainder of width between all the columns with percentage widths.
+     *      If the total of percentages is greater that 100%, it's will be normalized first..</li>
+     *   <ul>
+     *  </p>
+     *
+     * @default NaN
+     */
+    public function get percentWidth():Number
+    {
+        return _percentWidth;
+    }
+
+    public function set percentWidth(value:Number):void
+    {
+        _percentWidth = value;
+    }
+
+    private var _itemRenderer:IFactory;
+
+    /**
+     *  The class factory for the IItemPartRendererBase  class used to
+     *  render individual grid cells.
+     *
+     *  <p>The default item renderer is the ItemTextPartRenderer class,
+     *  which displays the data item as text, optimized for mobile.  </p>
+     *  <p>You can use also ItemBitmapPartRenderer to display embedded bitmaps, in which case you need to define the iconField or iconFunction </p>
+     *  <p>You can also  create custom item renderers by deriving any subclass of UIComponent (eg. s:Button) and implementing IItemPartRendererBase.
+     *  for performance reasons  it's preferable that your renderer be written in ActionScript
+     *
+     *  @see #dataField
+     *  @see spark.components.itemRenderers.ItemTextPartRenderer
+     *  @see spark.components.itemRenderers.ItemBitmapPartRenderer
+     *  @see spark.components.itemRenderers.IItemPartRendererBase
+     *
+     */
+    public function get itemRenderer():IFactory
+    {
+        return _itemRenderer;
+    }
+
+    public function set itemRenderer(value:IFactory):void
+    {
+        _itemRenderer = value ? value : new ClassFactory(ItemTextPartRenderer);
+    }
+
+    private var _labelFunction:Function;
+
+
+    /**
+     *  An idempotent function that converts a data provider item into a column-specific string
+     *  that's used to initialize the item renderer's <code>label</code> property.
+     *
+     *  <p>You can use a label function to combine the values of several data provider items
+     *  into a single string.
+     *  If specified, this property is used by the
+     *  <code>itemToLabel()</code> method, which computes the value of each item
+     *  renderer's <code>label</code> property in this column.</p>
+     *
+     *  <p>The function specified to the <code>labelFunction</code> property
+     *  must have the following signature:</p>
+     *
+     *  <pre>labelFunction(item:Object):String</pre>
+     *
+     *  <p>The <code>item</code> parameter is the data provider item for an entire row.
+     *  The second parameter is this column object.</p>
+     *
+     *  <p>A typical label function could concatenate the firstName and
+     *  lastName properties of the data provider item ,
+     *  or do some custom formatting on a Date value property.</p>
+     */
+    public function set labelFunction(value:Function):void
+    {
+        _labelFunction = value;
+    }
+
+    public function get labelFunction():Function
+    {
+        return _labelFunction;
+    }
+
+    private var _styleName:String;
+
+    /** The css style name to apply to the renderer
+     *  the style items in the css will depend on the renderer. For example, text renderers will accept fontSize, color, fontWeight, etc.
+     */
+    public function get styleName():String
+    {
+        return _styleName;
+    }
+
+    public function set styleName(value:String):void
+    {
+        _styleName = value;
+    }
+
+    /** Sets the alignment of text renderers.
+     * This property is ignored for non-text renderers.
+     */
+    [Inspectable(enumeration="left,right,center,justify")]
+    public function set textAlign(value:String):void
+    {
+        _textAlign = value;
+    }
+
+    private var _textAlign:String;
+
+    private var _headerText:String = null;
+
     /** Defines the text to be displayed in the column's header.
      * <p>If this property is not set, the header label will use the value  of dataField property instead.</p>
      * @see #dataField
@@ -72,6 +252,8 @@ public class MobileGridColumn extends PartRendererDescriptorBase
         _headerText = value;
     }
 
+    private var _headerStyleName:String;
+
     /** Defines the css style name to be used for displaying this column's header label.
      * <p>Use this property to display the header in a different color or font, or with a different text alignment.</p>
      */
@@ -85,6 +267,20 @@ public class MobileGridColumn extends PartRendererDescriptorBase
         _headerStyleName = value;
     }
 
+    private var _sortDescending:Boolean;
+
+    public function get sortDescending():Boolean
+    {
+        return _sortDescending;
+    }
+
+    public function set sortDescending(value:Boolean):void
+    {
+        _sortDescending = value;
+    }
+
+    private var _sortable:Boolean = true;
+
     /** Flag indicating whether a column can be sorted by clicking on its header.
      *  <p>This flag is effective only if the MobileGrid </p>
      */
@@ -98,20 +294,6 @@ public class MobileGridColumn extends PartRendererDescriptorBase
         _sortable = value;
     }
 
-    public function get sortDescending():Boolean
-    {
-        return _sortDescending;
-    }
-
-    public function set sortDescending(value:Boolean):void
-    {
-        _sortDescending = value;
-    }
-
-    //----------------------------------
-    //  sortField
-    //----------------------------------
-
     /**
      *  Returns a SortField that can be used to sort a collection by this
      *  column's <code>dataField</code>.
@@ -143,6 +325,27 @@ public class MobileGridColumn extends PartRendererDescriptorBase
         return sortField;
     }
 
+    public function createPartRenderer():IItemPartRendererBase
+    {
+        var pr:IItemPartRendererBase = _itemRenderer.newInstance() as IItemPartRendererBase;
+        if (pr)
+        {
+            pr.cssStyleName = _styleName;
+            if (pr is IItemTextPartRenderer)
+            {
+                with (IItemTextPartRenderer(pr))
+                {
+                    labelField = _dataField;
+                    labelFunction = _labelFunction;
+                    textAlign = _textAlign;
+                }
+            }
+        }
+        return pr;
+    }
+
+    mx_internal var colNum:int;
+    mx_internal var actualWidth:Number;
 
 }
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridHeader.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridHeader.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridHeader.as
index f92075b..7ef2232 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridHeader.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridHeader.as
@@ -20,6 +20,7 @@ package spark.components.supportClasses
 {
 
 import mx.collections.ArrayList;
+import mx.core.IVisualElement;
 import mx.core.UIComponent;
 import mx.core.mx_internal;
 
@@ -27,7 +28,6 @@ import spark.components.ButtonBar;
 import spark.components.MobileGrid;
 import spark.events.IndexChangeEvent;
 import spark.events.MobileGridHeaderEvent;
-import spark.events.RendererExistenceEvent;
 import spark.utils.MultiDPIBitmapSource;
 
 use namespace  mx_internal;
@@ -71,8 +71,6 @@ public class MobileGridHeader extends ButtonBar
         this.buttonMode = false;
         this.requireSelection = false;
         addEventListener(IndexChangeEvent.CHANGING, changingHandler);
-        addEventListener(RendererExistenceEvent.RENDERER_ADD, rendererAddHandler);
-
         descIconCls = new MultiDPIBitmapSource();
         descIconCls.source160dpi = descIcon160Cls;
         descIconCls.source320dpi = descIcon320Cls;
@@ -125,17 +123,6 @@ public class MobileGridHeader extends ButtonBar
             dataProvider.itemUpdated(_columns[_sortIndex]);
     }
 
-    private function rendererAddHandler(event:RendererExistenceEvent):void
-    {
-        var button:UIComponent = UIComponent(event.renderer);
-        var index:int = event.index;
-        var col:MobileGridColumn = MobileGridColumn(_columns[index]);
-        // expand the last button
-        if ((index != dataProvider.length - 1) || col.hasExplicitWidth)
-            button.explicitWidth = col.dpiScaledWidth;
-        else
-            button.percentWidth = 100;
-    }
 
     private function getIconForButton(col:MobileGridColumn):Object
     {
@@ -148,5 +135,29 @@ public class MobileGridHeader extends ButtonBar
             return null;
         }
     }
+
+    /**
+     *  @private
+     *  Return the item renderer at the specified index, or null.
+     */
+    private function getItemRenderer(index:int):IVisualElement
+    {
+        if (!dataGroup || (index < 0) || (index >= dataGroup.numElements))
+            return null;
+
+        return dataGroup.getElementAt(index);
+    }
+
+    public function updateHeaderWidths():void
+    {
+        if (dataProvider.length != _columns.length)
+            return; // not ready
+        var header:UIComponent;
+        for (var i:int = 0; i < _columns.length; i++)
+        {
+            header = UIComponent(this.getItemRenderer(i));
+            header.explicitWidth = _columns[i].actualWidth;
+        }
+    }
 }
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridRowRenderer.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridRowRenderer.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridRowRenderer.as
index b2a8d3e..c3a1446 100644
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridRowRenderer.as
+++ b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/MobileGridRowRenderer.as
@@ -18,16 +18,246 @@
 ////////////////////////////////////////////////////////////////////////////////
 package spark.components.supportClasses
 {
+import flash.display.DisplayObject;
+
+import spark.components.itemRenderers.IItemPartRendererBase;
+import spark.core.DisplayObjectSharingMode;
+import spark.core.IGraphicElement;
+import spark.core.IGraphicElementContainer;
+import spark.core.ISharedDisplayObject;
 
 /**  @private
+ *  This is the base class for multi-part renderers that manages a vector of part renderers.
+ *  This class is responsible for creating and storing  the actual renderers from their descriptors
+ *  the layout of the part renderers is delegated to a subclass of ListMultiPartLayoutBase;
+
  *    This is the internal list itemRenderer used for rendering grid cells in a single row of a MobileGrid.
  *    It inherits all its behavior for its parent class and only sets the part renderers layout.
+ *
+ *   @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ *
  */
-public class MobileGridRowRenderer extends ListMultiPartItemRendererBase
+public class MobileGridRowRenderer extends ItemRendererBase implements IGraphicElementContainer, ISharedDisplayObject
 {
+    private var _columns:Vector.<MobileGridColumn>;
+    private var _partRenderers:Vector.<IItemPartRendererBase>;
+    private var _graphicElementPartRenderers:Vector.<IGraphicElement>;
+    private var _partRenderersLayout:ListMultiPartColumnLayout;
+
+    /**
+     * Management of graphicElement part renderers  lifeCycle
+     */
+    private var _redrawRequested:Boolean = false;
+    private var graphicElementsNeedValidateProperties:Boolean = false;
+    private var graphicElementsNeedValidateSize:Boolean = false;
+
     public function MobileGridRowRenderer()
     {
-        partRenderersLayout = new ListMultiPartColumnLayout(this);
+        _partRenderersLayout = new ListMultiPartColumnLayout(this);
+    }
+
+    /** @private
+     * set in List itemRenderer Factory properties */
+    public function set columns(value:Vector.<MobileGridColumn>):void
+    {
+        _columns = value;
+        _partRenderers = new Vector.<IItemPartRendererBase>(_columns.length, true);
+        _graphicElementPartRenderers = new Vector.<IGraphicElement>();
+    }
+
+    public function get columns():Vector.<MobileGridColumn>
+    {
+        return _columns;
+    }
+
+    public function get partRenderers():Vector.<IItemPartRendererBase>
+    {
+        return _partRenderers;
+    }
+
+    public function get graphicElementPartRenderers():Vector.<IGraphicElement>
+    {
+        return _graphicElementPartRenderers;
+    }
+
+    override protected function createChildren():void
+    {
+        super.createChildren();
+        var desc:MobileGridColumn;
+        var pr:IItemPartRendererBase;
+        var ge:IGraphicElement;
+        for (var i:int = 0; i < _columns.length; i++)
+        {
+            desc = _columns[i];
+            pr = desc.createPartRenderer();
+            if (pr != null)
+            {
+                pr.styleProvider = this;
+
+                if (pr is IGraphicElement)
+                {
+                    ge = IGraphicElement(pr);
+                    ge.parentChanged(this);
+                    if (ge.setSharedDisplayObject(this))
+                    {
+                        ge.displayObjectSharingMode = DisplayObjectSharingMode.USES_SHARED_OBJECT;
+                    }
+                    _graphicElementPartRenderers.push(ge);
+                }
+                else if (pr is DisplayObject)
+                {
+                    addChild(DisplayObject(pr));
+                }
+                _partRenderers[i] = pr;
+            }
+            else
+            {
+                //TODO move to resource bundle
+                throw  new Error("MobileGridColumn item renderer must implement spark.components.itemRenderers.IItemPartRendererBase");
+            }
+        }
+    }
+
+    override protected function measure():void
+    {
+        super.measure();
+        _partRenderersLayout.measure();
+    }
+
+    /** delegate children layout to its partRendererLayout
+     subclasses can override this method to layout chrome content
+     */
+    override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
+    {
+        _partRenderersLayout.layoutContents(unscaledWidth, unscaledHeight);
+    }
+
+    override protected function onDataChanged():void
+    {
+        var dpr:IItemPartRendererBase;
+        for (var i:int = 0; i < _partRenderers.length; i++)
+        {
+            dpr = _partRenderers[i];
+            dpr.data = data;
+        }
+        invalidateSize();
+    }
+
+    /*  graphic element sub renderers lifecycle management */
+
+    override protected function commitProperties():void
+    {
+        if (graphicElementsNeedValidateProperties)
+        {
+            graphicElementsNeedValidateProperties = false;
+            for (var i:int = 0; i < _graphicElementPartRenderers.length; i++)
+            {
+                _graphicElementPartRenderers[i].validateProperties();
+            }
+        }
+        super.commitProperties();
+    }
+
+
+    override public function validateSize(recursive:Boolean = false):void
+    {
+        if (graphicElementsNeedValidateSize)
+        {
+            graphicElementsNeedValidateSize = false;
+            for (var i:int = 0; i < _graphicElementPartRenderers.length; i++)
+            {
+                _graphicElementPartRenderers[i].validateSize();
+            }
+        }
+        super.validateSize(recursive);
+    }
+
+
+    /* copied from Group*/
+    override public function validateDisplayList():void
+    {
+        super.validateDisplayList();
+        if (_redrawRequested)
+        {
+            for (var i:int = 0; i < _graphicElementPartRenderers.length; i++)
+            {
+                _graphicElementPartRenderers[i].validateDisplayList();
+            }
+        }
+    }
+
+    /* interfaces implementation, copied from spark.components.IconItemRender  */
+
+    /**
+     *  @inheritDoc
+     *
+     *  <p>We implement this as part of ISharedDisplayObject so the iconDisplay
+     *  can share our display object.</p>
+     *
+     *  @langversion 3.0
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    public function get redrawRequested():Boolean
+    {
+        return _redrawRequested;
+    }
+
+    /**
+     *  @private
+     */
+    public function set redrawRequested(value:Boolean):void
+    {
+        _redrawRequested = value;
+    }
+
+    //--------------------------------------------------------------------------
+    //
+    //  IGraphicElementContainer
+    //
+    // -------------------------------------------------------------------------
+
+    /**
+     * @private
+     *
+     *  Notify the host component that an element changed and needs to validate properties.
+     */
+    public function invalidateGraphicElementSharing(element:IGraphicElement):void
+    {
+        //do nothing because all has been done in createChildren and won't change
+    }
+
+    /**
+     * @private
+     *
+     *  Notify the host component that an element changed and needs to validate properties.
+     */
+    public function invalidateGraphicElementProperties(element:IGraphicElement):void
+    {
+        graphicElementsNeedValidateProperties = true;
+        invalidateProperties();
+    }
+
+    /**
+     * @private
+     */
+    public function invalidateGraphicElementSize(element:IGraphicElement):void
+    {
+        graphicElementsNeedValidateSize = true;
+        invalidateSize();
+    }
+
+    /**
+     * @private
+     *
+     */
+    public function invalidateGraphicElementDisplayList(element:IGraphicElement):void
+    {
+        if (element.displayObject is ISharedDisplayObject)
+            ISharedDisplayObject(element.displayObject).redrawRequested = true;
+        invalidateDisplayList();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/PartRendererDescriptorBase.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/PartRendererDescriptorBase.as b/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/PartRendererDescriptorBase.as
deleted file mode 100644
index 23ce03e..0000000
--- a/frameworks/projects/experimental_mobile/src/spark/components/supportClasses/PartRendererDescriptorBase.as
+++ /dev/null
@@ -1,189 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-//
-//  Licensed to the Apache Software Foundation (ASF) under one or more
-//  contributor license agreements.  See the NOTICE file distributed with
-//  this work for additional information regarding copyright ownership.
-//  The ASF licenses this file to You under the Apache License, Version 2.0
-//  (the "License"); you may not use this file except in compliance with
-//  the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-//  Unless required by applicable law or agreed to in writing, software
-//  distributed under the License is distributed on an "AS IS" BASIS,
-//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//  See the License for the specific language governing permissions and
-//  limitations under the License.
-//
-////////////////////////////////////////////////////////////////////////////////
-package spark.components.supportClasses
-{
-import flash.events.EventDispatcher;
-import flash.events.IEventDispatcher;
-
-import mx.core.ClassFactory;
-import mx.core.DPIClassification;
-import mx.core.IFactory;
-import mx.core.mx_internal;
-
-import spark.components.itemRenderers.IItemPartRendererBase;
-import spark.components.itemRenderers.IItemTextPartRenderer;
-import spark.components.itemRenderers.ItemTextPartRenderer;
-import spark.utils.DensityUtil2;
-
-/**  This is the base class for GridColumn
- *
- */
-public class PartRendererDescriptorBase extends EventDispatcher
-{
-
-    private var _colNum:int;
-    private var _dataField:String;
-    private var _width:Number;
-    private var _hasExplicitWidth:Boolean;
-    private var _dpiScaledWidth:Number;
-    private var _itemRenderer:IFactory;
-    private var _labelFunction:Function;
-    private var _styleName:String;
-    private var _textAlign:String;
-
-
-    public function PartRendererDescriptorBase(target:IEventDispatcher = null)
-    {
-        super(target);
-        _labelFunction = null;
-        setWidth(100); // default width;
-        itemRenderer = null; // will set default ;
-    }
-
-    /* IDataGridColumn impl*/
-
-    public function set dataField(value:String):void
-    {
-        _dataField = value;
-    }
-
-    public function get dataField():String
-    {
-        return _dataField;
-    }
-
-    public function get labelFunction():Function
-    {
-        return _labelFunction;
-    }
-
-    /**
-     *  An idempotent function that converts a data provider item into a column-specific string
-     *  that's used to initialize the item renderer's <code>label</code> property.
-     *
-     *  <p>You can use a label function to combine the values of several data provider items
-     *  into a single string.
-     *  If specified, this property is used by the
-     *  <code>itemToLabel()</code> method, which computes the value of each item
-     *  renderer's <code>label</code> property in this column.</p>
-     *
-     *  <p>The function specified to the <code>labelFunction</code> property
-     *  must have the following signature:</p>
-     *
-     *  <pre>labelFunction(item:Object):String</pre>
-     *
-     *  <p>The <code>item</code> parameter is the data provider item for an entire row.
-     *  The second parameter is this column object.</p>
-     *
-     *  <p>A typical label function could concatenate the firstName and
-     *  lastName properties of the data provider item ,
-     *  or do some custom formatting on a Date value property.</p>
-     */
-    public function set labelFunction(value:Function):void
-    {
-        _labelFunction = value;
-    }
-
-    public function set styleName(value:String):void
-    {
-        _styleName = value;
-    }
-
-    /** Set the desired width for this column.
-     * <p> Width value is expressed in current applicationDPI, or at 160 DPI  if applicationDPI is not set.</p>
-     * Default value is 100.
-     * Note that the last column will always expand
-     *
-     * @param value = desired width of the column at 160 DPI
-     */
-    public function set width(value:Number):void
-    {
-        setWidth(value);
-        _hasExplicitWidth = true;
-    }
-
-    protected function setWidth(value:Number):void
-    {
-        _width = value;
-        _dpiScaledWidth = DensityUtil2.dpiScale(value, DPIClassification.DPI_160);
-    }
-
-
-    public function get itemRenderer():IFactory
-    {
-        return _itemRenderer;
-    }
-
-    public function set itemRenderer(value:IFactory):void
-    {
-        _itemRenderer = value ? value : new ClassFactory(ItemTextPartRenderer);
-    }
-
-    public function get styleName():String
-    {
-        return _styleName;
-    }
-
-    [Inspectable(enumeration="left,right,center,justify")]
-    public function set textAlign(value:String):void
-    {
-        _textAlign = value;
-    }
-
-    public function createPartRenderer():IItemPartRendererBase
-    {
-        var pr:IItemPartRendererBase = _itemRenderer.newInstance() as IItemPartRendererBase;
-        if (pr)
-        {
-            pr.cssStyleName = _styleName;
-            if (pr is IItemTextPartRenderer)
-            {
-                with (IItemTextPartRenderer(pr))
-                {
-                    labelField = _dataField;
-                    labelFunction = _labelFunction;
-                    textAlign = _textAlign;
-                }
-            }
-        }
-        return pr;
-    }
-
-    mx_internal function get hasExplicitWidth():Boolean
-    {
-        return _hasExplicitWidth;
-    }
-
-    mx_internal function get dpiScaledWidth():Number
-    {
-        return  _dpiScaledWidth;
-    }
-
-    mx_internal function get colNum():int
-    {
-        return _colNum;
-    }
-
-    mx_internal function set colNum(value:int):void
-    {
-        _colNum = value;
-    }
-
-}
-}

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/events/MobileGridHeaderEvent.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/events/MobileGridHeaderEvent.as b/frameworks/projects/experimental_mobile/src/spark/events/MobileGridHeaderEvent.as
index 31e1462..c660941 100644
--- a/frameworks/projects/experimental_mobile/src/spark/events/MobileGridHeaderEvent.as
+++ b/frameworks/projects/experimental_mobile/src/spark/events/MobileGridHeaderEvent.as
@@ -31,7 +31,7 @@ import flash.events.Event;
  *  @productversion Flex 4.11
  */
 
-//   Note: we didn't use neither mx:DataGridEven because it's in not available for mobile not GridSortEvent because it handles multiple sorting
+//   Note: we didn't use neither mx:DataGridEvent because it's in not available for mobile not GridSortEvent because it handles multiple sorting
 public class MobileGridHeaderEvent extends Event
 {
 

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/layouts/MobileGridLayout.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/layouts/MobileGridLayout.as b/frameworks/projects/experimental_mobile/src/spark/layouts/MobileGridLayout.as
new file mode 100644
index 0000000..8149dfe
--- /dev/null
+++ b/frameworks/projects/experimental_mobile/src/spark/layouts/MobileGridLayout.as
@@ -0,0 +1,95 @@
+package spark.layouts
+{
+import mx.core.mx_internal;
+
+import spark.components.MobileGrid;
+import spark.components.supportClasses.MobileGridColumn;
+import spark.utils.DensityUtil2;
+
+use namespace  mx_internal;
+
+/**
+ * Internal class used for laying out rows, columns and headers of a MobileGrid component.
+ *
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ */
+public class MobileGridLayout extends VerticalLayout
+{
+    public function MobileGridLayout(grid:MobileGrid)
+    {
+        super();
+        _grid = grid;
+    }
+
+    private var prevUnscaledWidth:Number;
+    private var _grid:MobileGrid;
+
+    override public function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
+    {
+        super.updateDisplayList(unscaledWidth, unscaledHeight);
+        if (prevUnscaledWidth != unscaledWidth)
+        {
+            prevUnscaledWidth = unscaledWidth;
+            updateColumnWidths(unscaledWidth);
+        }
+    }
+
+    /**   compute colum actual widths from colum width and percentWidth
+     *     simple algorithm is following:
+     *     first set all columns that have fixed width
+     *     set distribute the remainder between the percentages, normalized to 100%
+     *
+     * @param unscaledWidth
+     */
+    protected function updateColumnWidths(unscaledWidth:Number):void
+    {
+        if (unscaledWidth == 0)
+            return;   // not ready
+
+        var colWidth:Number;
+        var colActualWidth:Number;
+
+        var totalFixedWidths:Number = 0;
+        var totalPercentages:Number = 0;
+        var cols:Array = _grid.columns;
+        var col:MobileGridColumn;
+
+        for (var i:int = 0; i < cols.length; i++)
+        {
+            col = cols[i];
+            if (!isNaN(col.percentWidth))
+            {
+                totalPercentages += col.percentWidth;
+            }
+            else
+            {
+                colWidth = isNaN(col.width) ? 100 : col.width;
+                colActualWidth = DensityUtil2.dpiScale(colWidth);
+                col.actualWidth = colActualWidth; // can immediately set actual width
+                totalFixedWidths += colActualWidth;
+            }
+        }
+
+        // distribute remainder to percent widths
+        var remainingWidth:Number = Math.max(0, unscaledWidth - totalFixedWidths);
+        var normalPercentWidth:Number;
+        for (var j:int = 0; j < cols.length; j++)
+        {
+            col = cols[j];
+            if (!isNaN(col.percentWidth))
+            {
+                normalPercentWidth = col.percentWidth / totalPercentages;
+                /* 0 .. 1*/
+                col.actualWidth = remainingWidth * normalPercentWidth;
+            }
+        }
+
+        // update also datagrid header ;
+        _grid.headerGroup.updateHeaderWidths();
+
+    }
+
+}
+}

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/utils/DensityUtil2.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/utils/DensityUtil2.as b/frameworks/projects/experimental_mobile/src/spark/utils/DensityUtil2.as
index 7f447ad..247c234 100644
--- a/frameworks/projects/experimental_mobile/src/spark/utils/DensityUtil2.as
+++ b/frameworks/projects/experimental_mobile/src/spark/utils/DensityUtil2.as
@@ -19,11 +19,25 @@
 package spark.utils
 {
 
+import mx.core.DPIClassification;
 import mx.core.FlexGlobals;
 import mx.managers.SystemManager;
 
 import spark.components.Application;
 
+//TODO merge with spark.utils.DensityUtil
+
+/**
+ * @private
+ * Utility class for density computations
+ *
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+
+ */
+
+
 public class DensityUtil2
 {
 
@@ -37,7 +51,7 @@ public class DensityUtil2
      * @param sourceDPI
      * @return  scaled value
      */
-    public static function dpiScale(value:Number, sourceDPI:Number):Number
+    public static function dpiScale(value:Number, sourceDPI:Number = DPIClassification.DPI_160):Number
     {
         var appDPI:Number = getSetApplicationDPI();
         if (isNaN(appDPI))

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/utils/MultiDPIBitmapSourceExt.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/utils/MultiDPIBitmapSourceExt.as b/frameworks/projects/experimental_mobile/src/spark/utils/MultiDPIBitmapSourceExt.as
index ce17ffe..0a01f34 100644
--- a/frameworks/projects/experimental_mobile/src/spark/utils/MultiDPIBitmapSourceExt.as
+++ b/frameworks/projects/experimental_mobile/src/spark/utils/MultiDPIBitmapSourceExt.as
@@ -21,6 +21,12 @@ package spark.utils
 import mx.core.FlexGlobals;
 import mx.utils.DensityUtil;
 
+//TODO mamsellem move this code to parent class, updates any callers, and remove this class
+
+/**  @private
+ * Adds default behavior to its parent class MultiDPIBitmapSource.
+ *
+ */
 public class MultiDPIBitmapSourceExt extends MultiDPIBitmapSource
 {
 
@@ -38,9 +44,8 @@ public class MultiDPIBitmapSourceExt extends MultiDPIBitmapSource
      *  @return One of the sourceXXXdpi properties based on the desired DPI.
      *
      *  @langversion 3.0
-     *  @playerversion Flash 10.2
-     *  @playerversion AIR 2.6
-     *  @productversion Flex 4.5
+     *  @playerversion AIR 3.8
+     *  @productversion Flex 4.11
      */
 
     override public function getSource(desiredDPI:Number):Object
@@ -59,7 +64,6 @@ public class MultiDPIBitmapSourceExt extends MultiDPIBitmapSource
             return super.getSource(desiredDPI);
     }
 
-    //TODO mamsellem move this code to parent class, updates any callers, and remove this class
 
 }
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/44826607/frameworks/projects/experimental_mobile/src/spark/utils/UIComponentUtils.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/experimental_mobile/src/spark/utils/UIComponentUtils.as b/frameworks/projects/experimental_mobile/src/spark/utils/UIComponentUtils.as
index 93f6f8e..737fa40 100644
--- a/frameworks/projects/experimental_mobile/src/spark/utils/UIComponentUtils.as
+++ b/frameworks/projects/experimental_mobile/src/spark/utils/UIComponentUtils.as
@@ -16,15 +16,21 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
+
 package spark.utils
 {
 import mx.core.IFlexDisplayObject;
 import mx.core.ILayoutElement;
 
+/**  @private
+ * Utility class for MobileGrid
+ *  @langversion 3.0
+ *  @playerversion AIR 3.8
+ *  @productversion Flex 4.11
+ */
 public class UIComponentUtils
 {
 
-
     public static function itemToLabel(item:Object, labelField:String, labelFunction:Function, nullLabel:String = '-'):String
     {
         if (labelFunction != null)