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)