This is an automated email from the ASF dual-hosted git repository.

alinakazi pushed a commit to branch feature/MXRoyale
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/feature/MXRoyale by this push:
     new 6a9043f  Spark List.as Added
6a9043f is described below

commit 6a9043f23e78ed482053312ff5a50751bdc5acd2
Author: alinakazi <[email protected]>
AuthorDate: Thu May 17 01:55:35 2018 -0700

    Spark List.as Added
---
 .../src/main/royale/spark/components/List.as       | 2941 ++++++++++++++++++++
 1 file changed, 2941 insertions(+)

diff --git 
a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/List.as 
b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/List.as
new file mode 100644
index 0000000..8b7cac7
--- /dev/null
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/List.as
@@ -0,0 +1,2941 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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
+{
+    
+/* import flash.display.DisplayObject;
+import flash.display.DisplayObjectContainer;
+import flash.events.Event;
+import flash.events.KeyboardEvent;
+import flash.events.MouseEvent;
+import flash.geom.Point;
+import flash.system.ApplicationDomain;
+import flash.text.TextField;
+import flash.ui.Keyboard; */
+/* 
+import mx.collections.ArrayCollection;
+import mx.collections.IList;
+import mx.core.DragSource;
+import mx.core.EventPriority;
+import mx.core.IFactory;
+import mx.core.IFlexDisplayObject;
+import mx.core.IUID;
+import mx.core.IVisualElement;
+import mx.core.InteractionMode;
+import mx.core.ScrollPolicy;
+import mx.core.UIComponentGlobals;
+import mx.events.DragEvent;
+import mx.events.FlexEvent;
+import mx.events.SandboxMouseEvent;
+import mx.events.TouchInteractionEvent;
+import mx.managers.DragManager;
+import mx.utils.ObjectUtil;
+import mx.utils.UIDUtil;
+import mx.utils.VectorUtil;
+import spark.core.NavigationUnit;
+import spark.events.IndexChangeEvent;
+import spark.events.RendererExistenceEvent;
+import spark.layouts.supportClasses.DropLocation;
+
+ */  //ListBase and List share selection properties that are mx_internal
+import mx.managers.IFocusManagerComponent;
+import spark.components.supportClasses.ListBase;
+import mx.core.mx_internal;
+use namespace mx_internal;
+//--------------------------------------
+//  Styles
+//--------------------------------------
+
+/**
+ *  @copy spark.components.supportClasses.GroupBase#style:alternatingItemColors
+ * 
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="alternatingItemColors", type="Array", arrayType="uint", 
format="Color", inherit="yes", theme="spark, mobile")]
+
+/**
+ *  The alpha of the border for this component.
+ *
+ *  @default 1.0
+ * 
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="borderAlpha", type="Number", inherit="no", theme="spark, 
mobile", minValue="0.0", maxValue="1.0")]
+
+/**
+ *  The color of the border for this component.
+ *
+ *   @default #696969
+ * 
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="borderColor", type="uint", format="Color", inherit="no", 
theme="spark, mobile")]
+
+/**
+ *  Controls the visibility of the border for this component.
+ *
+ *  @default true
+ * 
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+[Style(name="borderVisible", type="Boolean", inherit="no", theme="spark, 
mobile")]
+
+/**
+ *  The alpha of the content background for this component.
+ * 
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="contentBackgroundAlpha", type="Number", inherit="yes", 
theme="spark, mobile", minValue="0.0", maxValue="1.0")]
+
+/**
+ *  @copy 
spark.components.supportClasses.GroupBase#style:contentBackgroundColor
+ *   
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="contentBackgroundColor", type="uint", format="Color", 
inherit="yes", theme="spark, mobile")]
+
+/**
+ *  @copy spark.components.supportClasses.GroupBase#style:downColor
+ *   
+ *  @langversion 3.0
+ *  @playerversion Flash 10.1
+ *  @playerversion AIR 2.5
+ *  @productversion Flex 4.5
+ */
+//[Style(name="downColor", type="uint", format="Color", inherit="yes", 
theme="mobile")]
+
+/**
+ *  The class to create instance of for the drag indicator during drag
+ *  and drop operations initiated by the List.
+ *  Must be of type <code>IFlexDisplayObject</code>.
+ *
+ *  <p>If the class implements the <code>ILayoutManagerClient</code> interface,
+ *  then the instance is validated by the DragManager.</p>
+ *
+ *  <p>If the class implements the <code>IVisualElement</code> interface,
+ *  then the instance's <code>owner</code> property is set to the List
+ *  that initiates the drag.</p>
+ *
+ *  <p>The AIR DragManager takes a snapshot of the instance, while
+ *  the non-AIR DragManager uses the instance directly.</p>
+ *
+ *  @default spark.components.supportClasses.ListItemDragProxy
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="dragIndicatorClass", type="Class", inherit="no")]
+
+/**
+ *  If a <code>dropIndicator</code> skin part is not specified in the List 
skin,
+ *  then an instance of this class is created and used for the default drop
+ *  indicator during drag and drop operations where the List is a potential
+ *  drop target.
+ *
+ *  @default spark.skins.spark.ListDropIndicator
+ *
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="dropIndicatorSkin", type="Class", inherit="no")]
+
+/**
+ *  Indicates under what conditions the horizontal scroll bar is displayed.
+ * 
+ *  <ul>
+ *  <li>
+ *  <code>ScrollPolicy.ON</code> ("on") - the scroll bar is always displayed.
+ *  </li> 
+ *  <li>
+ *  <code>ScrollPolicy.OFF</code> ("off") - the scroll bar is never displayed.
+ *  The viewport can still be scrolled programmatically, by setting its
+ *  horizontalScrollPosition property.
+ *  </li>
+ *  <li>
+ *  <code>ScrollPolicy.AUTO</code> ("auto") - the scroll bar is displayed when 
+ *  the viewport's contentWidth is larger than its width.
+ *  </li>
+ *  </ul>
+ * 
+ *  <p>The scroll policy affects the measured size of the scroller skin part.  
This style
+ *  is simply a cover for the scroller skin part's horizontalScrollPolicy.  It 
is not an 
+ *  inheriting style so, for example, it will not affect item renderers.</p>
+ *
+ *  <p>When using a horizontal List control in a mobile application, 
+ *  set <code>horizontalScrollPolicy</code> to <code>on</code> 
+ *  and <code>verticalScrollPolicy</code> to <code>auto</code> 
+ *  to enable the horizontal bounce and pull effects. 
+ *  Otherwise, the control uses the vertical bounce and pull effects.</p>
+ * 
+ *  @default ScrollPolicy.AUTO
+ *
+ *  @see mx.core.ScrollPolicy
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */ 
+//[Style(name="horizontalScrollPolicy", type="String", inherit="no", 
enumeration="off,on,auto")]
+
+/**
+ *  @copy spark.components.supportClasses.GroupBase#style:rollOverColor
+ *   
+ *  @default 0xCEDBEF
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="rollOverColor", type="uint", format="Color", inherit="yes", 
theme="spark")]
+
+/**
+ *  The color of the background of a renderer when the user selects it.
+ *
+ *  <p>The default value for the Halo theme is <code>0x7FCEFF</code>.
+ *  The default value for the Spark theme is <code>0xA8C6EE</code>.
+ *  The default value for the Mobile theme is <code>0xE0E0E0</code>.</p>
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+//[Style(name="selectionColor", type="uint", format="Color", inherit="yes", 
theme="spark, mobile")]
+
+/**
+ *  @copy spark.components.supportClasses.GroupBase#style:symbolColor
+ *   
+ *  @default 0x000000
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */ 
+//[Style(name="symbolColor", type="uint", format="Color", inherit="yes", 
theme="spark, mobile")]
+
+/**
+ *  @copy spark.components.supportClasses.GroupBase#style:touchDelay
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10.1
+ *  @playerversion AIR 2.5
+ *  @productversion Flex 4.5
+ */
+//[Style(name="touchDelay", type="Number", format="Time", inherit="yes", 
minValue="0.0")]
+
+/**
+ *  Indicates under what conditions the vertical scroll bar is displayed.
+ * 
+ *  <ul>
+ *  <li>
+ *  <code>ScrollPolicy.ON</code> ("on") - the scroll bar is always displayed.
+ *  </li> 
+ *  <li>
+ *  <code>ScrollPolicy.OFF</code> ("off") - the scroll bar is never displayed.
+ *  The viewport can still be scrolled programmatically, by setting its
+ *  verticalScrollPosition property.
+ *  </li>
+ *  <li>
+ *  <code>ScrollPolicy.AUTO</code> ("auto") - the scroll bar is displayed when 
+ *  the viewport's contentHeight is larger than its height.
+ *  </li>
+ *  </ul>
+ * 
+ *  <p>
+ *  The scroll policy affects the measured size of the scroller skin part.  
This style
+ *  is simply a cover for the scroller skin part's verticalScrollPolicy.  It 
is not an 
+ *  inheriting style so, for example, it will not affect item renderers.
+ *  </p>
+ *
+ *  <p>When using a horizontal List control in a mobile application, 
+ *  set <code>horizontalScrollPolicy</code> to <code>on</code> 
+ *  and <code>verticalScrollPolicy</code> to <code>auto</code> 
+ *  to enable the horizontal bounce and pull effects. 
+ *  Otherwise, the control uses the vertical bounce and pull effects.</p>
+ * 
+ *  @default ScrollPolicy.AUTO
+ *
+ *  @see mx.core.ScrollPolicy
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */ 
+//[Style(name="verticalScrollPolicy", type="String", inherit="no", 
enumeration="off,on,auto")]
+
+//--------------------------------------
+//  Other metadata
+//--------------------------------------
+
+//[AccessibilityClass(implementation="spark.accessibility.ListAccImpl")]
+
+[DefaultTriggerEvent("change")]
+
+//[IconFile("List.png")]
+
+/**
+ *  The List control displays a vertical list of items.
+ *  Its functionality is similar to that of the SELECT
+ *  form element in HTML.
+ *  If there are more items than can be displayed at once, it
+ *  can display a vertical scroll bar so the user can access
+ *  all items in the list.
+ *  An optional horizontal scroll bar lets the user view items
+ *  when the full width of the list items is unlikely to fit.
+ *  The user can select one or more items from the list, depending
+ *  on the value of the <code>allowMultipleSelection</code> property.
+ *
+ *  <p><b>Note: </b>The Spark list-based controls (the Spark ListBase class 
and its subclasses
+ *  such as ButtonBar, ComboBox, DropDownList, List, and TabBar) do not 
support the BasicLayout class
+ *  as the value of the <code>layout</code> property. 
+ *  Do not use BasicLayout with the Spark list-based controls.  When a layout 
is specified,
+ *  the layout's typicalLayoutElement property should not be set; it's 
automatically set
+ *  to an item renderer created with the List's <code>typicalItem</code>.</p>
+ *
+ *  <p>To use this component in a list-based component, such as a List or 
DataGrid, 
+ *  create an item renderer.
+ *  For information about creating an item renderer, see 
+ *  <a 
href="http://help.adobe.com/en_US/flex/using/WS4bebcd66a74275c3-fc6548e124e49b51c4-8000.html";>
+ *  Custom Spark item renderers</a>. </p>
+ *
+ *  <p>The List control has the following default characteristics:</p>
+ *  <table class="innertable">
+ *     <tr><th>Characteristic</th><th>Description</th></tr>
+ *     <tr><td>Default size</td><td>112 pixels wide by 112 pixels 
high</td></tr>
+ *     <tr><td>Minimum size</td><td>112 pixels wide by 112 pixels 
high</td></tr>
+ *     <tr><td>Maximum size</td><td>10000 pixels wide and 10000 pixels 
high</td></tr>
+ *     <tr><td>Default skin class</td><td>spark.skins.spark.ListSkin</td></tr>
+ *  </table>
+ *
+ *  @mxml <p>The <code>&lt;s:List&gt;</code> tag inherits all of the tag 
+ *  attributes of its superclass and adds the following tag attributes:</p>
+ *
+ *  <pre>
+ *  &lt;s:List
+ *    <strong>Properties</strong>
+ *    allowMultipleSelection="false"
+ *    dragEnabled="false"
+ *    dragMoveEnabled="false"
+ *    dropEnabled="false"
+ *    selectedIndices="null"
+ *    selectedItems="null"
+ *    useVirtualLayout="true"
+ * 
+ *    <strong>Styles</strong>
+ *    alternatingItemColors="undefined"
+ *    borderAlpha="1.0"
+ *    borderColor="0#CCCCCC"
+ *    borderVisible="true"
+ *    contentBackgroundColor="0xFFFFFF"
+ *    downColor="0xA8C6EE"
+ *    dragIndicator="ListItemDragProxy"
+ *    dropIndicatorSkin="ListDropIndicator"
+ *    rollOverColor="0xCEDBEF"
+ *    selectionColor="0xA8C6EE"
+ *    symbolColor="0x000000"
+ *  /&gt;
+ *  </pre>
+ *
+ *  @see spark.skins.spark.ListSkin
+ *
+ *  @includeExample examples/ListExample.mxml
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+public class List extends ListBase implements IFocusManagerComponent
+{
+   // include "../core/Version.as";
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Class mixins
+    //
+    
//--------------------------------------------------------------------------
+
+    /**
+     *  @private
+     *  Placeholder for mixin by ListAccImpl.
+     */
+   // mx_internal static var createAccessibilityImplementation:Function;
+
+    
//--------------------------------------------------------------------------
+    //
+    //  Constructor
+    //
+    
//--------------------------------------------------------------------------
+    
+    /**
+     *  Constructor.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    public function List()
+    {
+        super();
+
+       /*  useVirtualLayout = true;
+        
+        // If available, get soft reference to the RichEditableText class
+        // to use in keyDownHandler().
+        if (ApplicationDomain.currentDomain.hasDefinition(
+            "spark.components.RichEditableText"))
+        {
+            richEditableTextClass =
+                Class(ApplicationDomain.currentDomain.getDefinition(
+                    "spark.components.RichEditableText"));
+        }
+        
+        addEventListener(TouchInteractionEvent.TOUCH_INTERACTION_START, 
touchInteractionStartHandler); */
+    }
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Variables
+    //
+    
//--------------------------------------------------------------------------
+    
+    /**
+     *  @private
+     *  The point where the mouse down event was received.
+     *  Used to track whether a drag operation should be initiated when the 
user
+     *  drags further than a certain threshold. 
+     */
+    //mx_internal var mouseDownPoint:Point;
+
+    /**
+     *  @private
+     *  The index of the element the mouse down event was received for. Used to
+     *  track which is the "focus item" for a drag and drop operation.
+     */
+    //mx_internal var mouseDownIndex:int = -1;
+    
+    /**
+     *  @private
+     *  The displayObject where the mouse down event was received.
+     *  In touch interactionMode, used to track whether this item is 
+     *  the one that is moused up on so we can possibly select it. 
+     */
+    //mx_internal var mouseDownObject:DisplayObject;
+    
+    /**
+     *  @private
+     *  When dragging is enabled with multiple selection, the selection is not
+     *  comitted immediately on mouse down, but we wait to see whether the user
+     *  intended to start a drag gesture instead. In that case we postpone
+     *  comitting the selection until mouse up.
+     */
+   // mx_internal var pendingSelectionOnMouseUp:Boolean = false;
+
+    /**
+     *  @private
+     */
+    //mx_internal var pendingSelectionShiftKey:Boolean;
+
+    /**
+     *  @private
+     */
+    //mx_internal var pendingSelectionCtrlKey:Boolean;
+    
+    /**
+     *  @private
+     *  Soft reference to RichEditableText class object, if available.
+     */
+    //private var richEditableTextClass:Class;
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Skin Parts
+    //
+    
//--------------------------------------------------------------------------
+
+    //----------------------------------
+    //  dropIndicator
+    //----------------------------------
+
+    //[SkinPart(required="false", type="flash.display.DisplayObject")]
+
+    /**
+     *  A skin part that defines the appearance of the drop indicator. 
+     *  The drop indicator is resized and positioned by the layout 
+     *  to outline the insert location when dragging over the List.
+     *
+     *  <p>By default, the drop indicator for a Spark control is a solid line 
+     *  that spans the width of the control.
+     *  Create a custom drop indicator by creating a custom skin class for the 
drop target.
+     *  In your skin class, create a skin part named 
<code>dropIndicator</code>,
+     *  in the &lt;fx:Declarations&gt; area of the skin class.</p>
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+   // public var dropIndicator:IFactory; 
+
+    //----------------------------------
+    //  scroller
+    //----------------------------------
+
+   // [SkinPart(required="false")]
+
+    /**
+     *  The optional Scroller used to scroll the List.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+  //  public var scroller:Scroller;
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Overridden properties
+    //
+    
//--------------------------------------------------------------------------
+
+    //----------------------------------
+    //  hasFocusableChildren
+    //----------------------------------
+
+    /**
+     *  A flag that indicates whether this List's focusable item renderers 
+     *  can take keyboard focus. 
+     *
+     *  <p><b>Note: </b>This property is similar to the 
<code>tabChildren</code> property
+     *  used by Flash Player. 
+     *  Use the <code>hasFocusableChildren</code> property with Flex 
applications.
+     *  Do not use the <code>tabChildren</code> property.</p>
+     *
+     *  <p>This property is usually <code>false</code> because most components
+     *  either receive focus themselves or delegate focus to a single
+     *  internal sub-component and appear as if the component has
+     *  received focus. You may choose to set this to true on a  List 
+     *  such that the contents within your List become focusable.</p>
+     * 
+     *  <p>If set, and the List skin contains a Scroller skin part, 
+     *  the value is proxied down onto the Scroller.</p> 
+     * 
+     *  <p>If the value is <code>true</code>, this proxying means that
+     *  the contents of the Scroller, like item renderers, are now 
+     *  focusable. For example, this means the first tab keystroke will 
+     *  put focus on the List control, and the second tab keystroke will 
+     *  put focus on the first focusable child of the Scroller.</p> 
+     *  
+     *  <p>If <code>false</code>, the first tab keystroke will put focus 
+     *  on the List control and the second tab keystroke will move focus 
+     *  to the next focusable control after the List.</p> 
+     *  
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* override public function set hasFocusableChildren(value:Boolean):void
+    {
+        super.hasFocusableChildren = value;
+
+        if (scroller)
+            scroller.hasFocusableChildren = value;
+    } */
+    
+    //----------------------------------
+    //  useVirtualLayout
+    //----------------------------------
+
+    /**
+     *  @inheritDoc
+     *
+     *  @default true
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* override public function get useVirtualLayout():Boolean
+    {
+        return super.useVirtualLayout;
+    } */
+
+    /**
+     *  Overrides the inherited default property , it is true for this class.
+     * 
+     *  Sets the value of the <code>useVirtualLayout</code> property
+     *  of the layout associated with this control.  
+     *  If the layout is subsequently replaced and the value of this 
+     *  property is <code>true</code>, then the new layout's 
+     *  <code>useVirtualLayout</code> property is set to <code>true</code>.
+     *
+     *  @default true
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* override public function set useVirtualLayout(value:Boolean):void
+    {
+        super.useVirtualLayout = value;
+    } */
+    
+
+    
//--------------------------------------------------------------------------
+    //
+    //  Properties
+    //
+    
//--------------------------------------------------------------------------
+    
+    //----------------------------------
+    //  allowMultipleSelection
+    //----------------------------------
+    
+    /**
+     *  @private
+     */
+    /* private var _allowMultipleSelection:Boolean = false;
+
+    [Inspectable(category="General", defaultValue="false")] */
+    
+    /**
+     *  If <code>true</code> multiple selection is enabled. 
+     *  When switched at run time, the current selection
+     *  is cleared. 
+     * 
+     *  This should not be turned on when <code>interactionMode</code> 
+     *  is <code>touch</code>.
+     *
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+   /*  public function get allowMultipleSelection():Boolean
+    {
+        return _allowMultipleSelection;
+    } */
+    
+    /**
+     *  @private
+     */
+    /* public function set allowMultipleSelection(value:Boolean):void
+    {
+        if (value == _allowMultipleSelection)
+            return;     
+        
+        _allowMultipleSelection = value; 
+    } */
+    
+    //----------------------------------
+    //  dragEnabled
+    //----------------------------------
+    
+    /**
+     *  @private
+     *  Storage for the dragEnabled property.
+     */
+   /*  private var _dragEnabled:Boolean = false;
+    
+    [Inspectable(defaultValue="false")] */
+    
+    /**
+     *  A flag that indicates whether you can drag items out of
+     *  this control and drop them on other controls.
+     *  If <code>true</code>, dragging is enabled for the control.
+     *  If the <code>dropEnabled</code> property is also <code>true</code>,
+     *  you can drag items and drop them within this control
+     *  to reorder the items.
+     * 
+     *  <p>Drag and drop is not supported on mobile devices where 
+     *  <code>interactionMode</code> is set to <code>touch</code>.</p>
+     *
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+   /*  public function get dragEnabled():Boolean
+    {
+        return _dragEnabled;
+    } */
+    
+    /**
+     *  @private
+     */
+   /*  public function set dragEnabled(value:Boolean):void
+    {
+        if (value == _dragEnabled)
+            return;
+        _dragEnabled = value;
+        
+        if (_dragEnabled)
+        {
+            addEventListener(DragEvent.DRAG_START, dragStartHandler, false, 
EventPriority.DEFAULT_HANDLER);
+            addEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler, 
false, EventPriority.DEFAULT_HANDLER);
+        }
+        else
+        {
+            removeEventListener(DragEvent.DRAG_START, dragStartHandler, false);
+            removeEventListener(DragEvent.DRAG_COMPLETE, dragCompleteHandler, 
false);
+        }
+    } */
+    
+    //----------------------------------
+    //  dragMoveEnabled
+    //----------------------------------
+    
+    /**
+     *  @private
+     *  Storage for the dragMoveEnabled property.
+     */
+    /* private var _dragMoveEnabled:Boolean = false;
+    
+    [Inspectable(defaultValue="false")] */
+    
+    /**
+     *  A flag that indicates whether items can be moved instead
+     *  of just copied from the control as part of a drag-and-drop
+     *  operation.
+     *  If <code>true</code>, and the <code>dragEnabled</code> property
+     *  is <code>true</code>, items can be moved.
+     *  Often the data provider cannot or should not have items removed
+     *  from it, so a MOVE operation should not be allowed during
+     *  drag-and-drop.
+     * 
+     *  <p>Drag and drop is not supported on mobile devices where 
+     *  <code>interactionMode</code> is set to <code>touch</code>.</p>
+     *
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function get dragMoveEnabled():Boolean
+    {
+        return _dragMoveEnabled;
+    } */
+    
+    /**
+     *  @private
+     */
+    /* public function set dragMoveEnabled(value:Boolean):void
+    {
+        _dragMoveEnabled = value;
+    } */
+
+    //----------------------------------
+    //  dropEnabled
+    //----------------------------------
+
+    /**
+     *  @private
+     *  Storage for the <code>dropEnabled</code> property.
+     */
+   /*  private var _dropEnabled:Boolean = false;
+
+    [Inspectable(defaultValue="false")] */
+
+    /**
+     *  A flag that indicates whether dragged items can be dropped onto the 
+     *  control.
+     *
+     *  <p>If you set this property to <code>true</code>,
+     *  the control accepts all data formats, and assumes that
+     *  the dragged data matches the format of the data in the data provider.
+     *  If you want to explicitly check the data format of the data
+     *  being dragged, you must handle one or more of the drag events,
+     *  such as <code>dragEnter</code> and <code>dragOver</code>, 
+     *  and call the DragEvent's <code>preventDefault()</code> method 
+     *  to customize the way the list class accepts dropped data.</p>
+     * 
+     *  <p>Drag and drop is not supported on mobile devices where 
+     *  <code>interactionMode</code> is set to <code>touch</code>.</p>
+     *
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function get dropEnabled():Boolean
+    {
+        return _dropEnabled;
+    } */
+
+    /**
+     *  @private
+     */
+    /* public function set dropEnabled(value:Boolean):void
+    {
+        if (value == _dropEnabled)
+            return;
+        _dropEnabled = value;
+        
+        if (_dropEnabled)
+        {
+            addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler, false, 
EventPriority.DEFAULT_HANDLER);
+            addEventListener(DragEvent.DRAG_EXIT, dragExitHandler, false, 
EventPriority.DEFAULT_HANDLER);
+            addEventListener(DragEvent.DRAG_OVER, dragOverHandler, false, 
EventPriority.DEFAULT_HANDLER);
+            addEventListener(DragEvent.DRAG_DROP, dragDropHandler, false, 
EventPriority.DEFAULT_HANDLER);
+        }
+        else
+        {
+            removeEventListener(DragEvent.DRAG_ENTER, dragEnterHandler, false);
+            removeEventListener(DragEvent.DRAG_EXIT, dragExitHandler, false);
+            removeEventListener(DragEvent.DRAG_OVER, dragOverHandler, false);
+            removeEventListener(DragEvent.DRAG_DROP, dragDropHandler, false);
+        }
+    } */
+
+    //----------------------------------
+    //  selectedIndices
+    //----------------------------------
+    
+    /**
+     *  @private
+     *  Internal storage for the selectedIndices property.
+     */
+//     private var _selectedIndices:Vector.<int> = new Vector.<int>();
+    
+    /**
+     *  @private
+     */
+    //private var _proposedSelectedIndices:Vector.<int> = new Vector.<int>(); 
+    
+    /**
+     *  @private
+     */
+    /* private var multipleSelectionChanged:Boolean; 
+    
+    [Bindable("change")]
+    [Bindable("valueCommit")]
+    [Inspectable(category="General")] */
+    
+    /**
+     *  A Vector of ints representing the indices of the currently selected  
+     *  item or items. 
+     *  If multiple selection is disabled by setting 
+     *  <code>allowMultipleSelection</code> to <code>false</code>, and this 
property  
+     *  is set, the data item corresponding to the first index in the Vector 
is selected.  
+     *
+     *  <p>If multiple selection is enabled by setting 
+     *  <code>allowMultipleSelection</code> to <code>true</code>, this 
property  
+     *  contains a list of the selected indices in the reverse order in which 
they were selected. 
+     *  That means the first element in the Vector corresponds to the last 
item selected.</p>
+     *  
+     *  @default []
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+   /*  public function get selectedIndices():Vector.<int>
+    {
+        return _selectedIndices;
+    } */
+    
+    /**
+     *  @private
+     */
+    /* public function set selectedIndices(value:Vector.<int>):void
+    {
+        setSelectedIndices(value, false);
+    } */
+    
+    /**
+     *  @private
+     *  Used internally to specify whether the selectedIndices changed 
programmatically or due to 
+     *  user interaction.
+     *
+     *  @param value the new indices.
+     *  @param dispatchChangeEvent if true, the component will dispatch a 
"change" event if the
+     *  value has changed. Otherwise, it will dispatch a "valueCommit" event. 
+     * 
+     *  @param changeCaret if true, the caret will be set to the selectedIndex 
as a side-effect of calling 
+     *  this method.  If false, caretIndex won't change.
+     */
+    /* mx_internal function setSelectedIndices(value:Vector.<int>, 
dispatchChangeEvent:Boolean = false, changeCaret:Boolean = true):void
+    {
+        // TODO (jszeto) Do a deep compare of the vectors
+        if (_proposedSelectedIndices == value || 
+            (value && value.length == 1 && 
+             selectedIndices && selectedIndices.length == 1 &&    
+             value[0] == selectedIndices[0]))
+        {
+            // this should short-circuit, but we should check to make sure 
+            // that caret doesn't need to be changed either, as that's a side
+            // effect of setting selectedIndex
+            if (changeCaret)
+                setCurrentCaretIndex(selectedIndex);
+            
+            return;
+        }
+        
+        if (dispatchChangeEvent)
+            dispatchChangeAfterSelection = (dispatchChangeAfterSelection || 
dispatchChangeEvent);
+        
+        if (value)
+            _proposedSelectedIndices = value;
+        else
+            _proposedSelectedIndices = new Vector.<int>();
+        multipleSelectionChanged = true;
+        changeCaretOnSelection = changeCaret;
+        invalidateProperties();
+    } */
+    
+    //----------------------------------
+    //  selectedItems
+    //----------------------------------
+
+    /* [Bindable("change")]
+    [Bindable("valueCommit")]
+    [Inspectable(category="General")] */
+    
+    /**
+     *  A Vector of Objects representing the currently selected data items. 
+     *  If multiple selection is disabled by setting 
<code>allowMultipleSelection</code>
+     *  to <code>false</code>, and this property is set, the data item 
+     *  corresponding to the first item in the Vector is selected.  
+     *
+     *  <p>If multiple selection is enabled by setting 
+     *  <code>allowMultipleSelection</code> to <code>true</code>, this 
property  
+     *  contains a list of the selected items in the reverse order in which 
they were selected. 
+     *  That means the first element in the Vector corresponds to the last 
item selected.</p>
+     * 
+     *  @default []
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function get selectedItems():Vector.<Object>
+    {
+        var result:Vector.<Object> = new Vector.<Object>();
+        
+        if (selectedIndices)
+        {
+            var count:int = selectedIndices.length;
+            
+            for (var i:int = 0; i < count; i++)
+                result[i] = dataProvider.getItemAt(selectedIndices[i]);  
+        }
+        
+        return result;
+    } */
+    
+    /**
+     *  @private
+     */
+    /* public function set selectedItems(value:Vector.<Object>):void
+    {
+        var indices:Vector.<int> = new Vector.<int>();
+        
+        if (value)
+        {
+            var count:int = value.length;
+            
+            for (var i:int = 0; i < count; i++)
+            {
+                var index:int = dataProvider.getItemIndex(value[i]);
+                if (index != -1)
+                { 
+                    indices.splice(0, 0, index);   
+                }
+                // If an invalid item is in the selectedItems vector,
+                // we set selectedItems to an empty vector, which 
+                // essentially clears selection. 
+                if (index == -1)
+                {
+                    indices = new Vector.<int>();
+                    break;  
+                }
+            }
+        }
+        
+        _proposedSelectedIndices = indices;
+        multipleSelectionChanged = true;
+        invalidateProperties(); 
+    } */
+
+    //----------------------------------
+    //  pageScrollingEnabled
+    //----------------------------------
+
+    /* private var _pageScrollingEnabled:Boolean = false;
+    
+    [Inspectable(category="General", defaultValue="false")] */
+
+    /**
+     *  Whether page scrolling is currently enabled for this Scroller
+     *
+     *  @default false
+     *
+     *  @langversion 3.0
+     *  @playerversion AIR 3
+     *  @productversion Flex 4.6
+     */
+    /* public function get pageScrollingEnabled():Boolean
+    {
+        if (scroller)
+            return scroller.pageScrollingEnabled;
+        return _pageScrollingEnabled;
+    } */
+    
+    /**
+     *  @private 
+     */
+    /* public function set pageScrollingEnabled(value:Boolean):void
+    {
+        if (scroller)
+            scroller.pageScrollingEnabled = value;
+        _pageScrollingEnabled = value;
+    } */
+    
+    //----------------------------------
+    //  scrollSnappingMode
+    //----------------------------------
+    
+    /* private var _scrollSnappingMode:String = ScrollSnappingMode.NONE; 
+    
+    [Inspectable(category="General", 
enumeration="none,leadingEdge,center,trailingEdge", defaultValue="none")] */
+    
+    /**
+     *  The scroll snapping mode currently in effect for this Scroller
+     *
+     *  <p>Changing this property to anything other than "none" may
+     *  result in an immediate change in scroll position to ensure
+     *  an element is correctly "snapped" into position.  This change
+     *  in scroll position is not animated</p>
+     *
+     *  @see spark.components.ScrollSnappingMode
+     *
+     *  @default "none"
+     *
+     *  @langversion 3.0
+     *  @playerversion AIR 3
+     *  @productversion Flex 4.6
+     */
+    /* public function get scrollSnappingMode():String
+    {
+        if (scroller)
+            return scroller.scrollSnappingMode;
+        return _scrollSnappingMode;
+    } */
+    
+    /**
+     *  @private 
+     */
+    /* public function set scrollSnappingMode(value:String):void    
+    {
+        if (scroller)
+            scroller.scrollSnappingMode = value;
+        _scrollSnappingMode = value;
+    } */
+
+    
//--------------------------------------------------------------------------
+    //
+    //  Overridden methods
+    //
+    
//--------------------------------------------------------------------------
+    
+     /**
+     *  @private
+     */
+   /*  override protected function initializeAccessibility():void
+    {
+        if (List.createAccessibilityImplementation != null)
+            List.createAccessibilityImplementation(this);
+    } */
+    
+     /**
+     *  @private
+     */
+    /* override protected function commitProperties():void
+    {
+        super.commitProperties(); 
+        
+        if (multipleSelectionChanged)
+        {
+            // multipleSelectionChanged flag is cleared in commitSelection();
+            // this is so, because commitSelection() could be called from
+            // super.commitProperties() as well and in that case we don't
+            // want to commitSelection() twice, as that will actually wrongly 
+            // clear the selection.
+            commitSelection();
+        }
+    } */
+    
+    /**
+     *  @private
+     */
+    /* override protected function partAdded(partName:String, 
instance:Object):void
+    {
+        super.partAdded(partName, instance);
+
+        if (instance == scroller)
+        {
+            scroller.hasFocusableChildren = hasFocusableChildren;
+            
+            // The scrollPolicy styles are initialized in 
framework/defaults.css
+            // so there's no way to determine if been explicitly set here.  To 
avoid 
+            // preempting explicitly set scroller scrollPolicy styles with the 
default
+            // "auto" value, we only forward the style if it's not "auto".     
       
+            
+            const vsp:String = getStyle("verticalScrollPolicy");
+            if (vsp && (vsp !== ScrollPolicy.AUTO))
+                scroller.setStyle("verticalScrollPolicy", vsp);
+            
+            const hsp:String = getStyle("horizontalScrollPolicy");
+            if (hsp && (hsp !== ScrollPolicy.AUTO))
+                scroller.setStyle("horizontalScrollPolicy", hsp);
+            
+            scroller.pageScrollingEnabled = _pageScrollingEnabled;
+            scroller.scrollSnappingMode = _scrollSnappingMode;
+        }
+    } */
+
+    /**
+     *  @private
+     *  Called when an item has been added to this component.
+     */
+    /* override protected function itemAdded(index:int):void
+    {
+        adjustSelection(index, true); 
+    } */
+    
+    /**
+     *  @private
+     *  Called when an item has been removed from this component.
+     */
+    /* override protected function itemRemoved(index:int):void
+    {
+        adjustSelection(index, false);        
+    } */
+    
+    /**
+     *  @private
+     *  Used to filter _proposedSelectedIndices.
+     */
+    /* private function isValidIndex(item:int, index:int, 
v:Vector.<int>):Boolean
+    {
+        return (dataProvider != null) && (item >= 0) && (item < 
dataProvider.length); 
+    } */
+    
+    /**
+     *  @private
+     *  Let ListBase handle single selection and afterwards come in and 
+     *  handle multiple selection via the commitMultipleSelection() 
+     *  helper method. 
+     */
+    /* override protected function 
commitSelection(dispatchChangedEvents:Boolean = true):Boolean
+    {
+        // Clear the flag so that we don't commit the selection again.
+        multipleSelectionChanged = false;
+        
+        var oldSelectedIndex:Number = _selectedIndex;
+        var oldCaretIndex:Number = _caretIndex;  
+        
+        _proposedSelectedIndices = 
_proposedSelectedIndices.filter(isValidIndex);
+        
+        // Ensure that multiple selection is allowed and that proposed 
+        // selected indices honors it. For example, in the single 
+        // selection case, proposedSelectedIndices should only be a 
+        // vector of 1 entry. If its not, we pare it down and select the 
+        // first item.  
+        if (!allowMultipleSelection && !isEmpty(_proposedSelectedIndices))
+        {
+            var temp:Vector.<int> = new Vector.<int>(); 
+            temp.push(_proposedSelectedIndices[0]); 
+            _proposedSelectedIndices = temp;  
+        }
+        // Keep _proposedSelectedIndex in-sync with multiple selection 
properties. 
+        if (!isEmpty(_proposedSelectedIndices))
+            _proposedSelectedIndex = 
VectorUtil.getFirstItem(_proposedSelectedIndices);
+        
+        // need to store changeCaretOnSelection since super.commitSelection() 
may change it
+        var currentChangeCaretOnSelection:Boolean = changeCaretOnSelection;
+        
+        // Let ListBase handle the validating and commiting of the 
single-selection
+        // properties.  
+        var retVal:Boolean = super.commitSelection(false); 
+        
+        // If super.commitSelection returns a value of false, 
+        // the selection was cancelled, so return false and exit. 
+        if (!retVal)
+            return false; 
+        
+        // Now keep _proposedSelectedIndices in-sync with single selection 
+        // properties now that the single selection properties have been 
+        // comitted.  
+        if (selectedIndex > NO_SELECTION)
+        {
+            if (_proposedSelectedIndices && 
_proposedSelectedIndices.indexOf(selectedIndex) == -1)
+                _proposedSelectedIndices.push(selectedIndex);
+        }
+        
+        // Validate and commit the multiple selection related properties. 
+        commitMultipleSelection(); 
+        
+        // Set the caretIndex based on the current selection 
+        if (currentChangeCaretOnSelection)
+            setCurrentCaretIndex(selectedIndex);
+        
+        // And dispatch change and caretChange events so that all of 
+        // the bindings update correctly. 
+        if (dispatchChangedEvents && retVal)
+        {
+            var e:IndexChangeEvent; 
+            
+            if (dispatchChangeAfterSelection)
+            {
+                e = new IndexChangeEvent(IndexChangeEvent.CHANGE);
+                e.oldIndex = oldSelectedIndex;
+                e.newIndex = _selectedIndex;
+                dispatchEvent(e);
+                dispatchChangeAfterSelection = false;
+            }
+
+            dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
+            
+            if (currentChangeCaretOnSelection)
+            {
+                e = new IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
+                e.oldIndex = oldCaretIndex; 
+                e.newIndex = caretIndex;
+                dispatchEvent(e);
+            }
+        }
+        
+        return retVal; 
+    } */
+    
+    /**
+     *  @private
+     *  Given a new selection interval, figure out which
+     *  items are newly added/removed from the selection interval and update
+     *  selection properties and view accordingly. 
+     */
+    /* protected function commitMultipleSelection():void
+    {
+        var removedItems:Vector.<int> = new Vector.<int>();
+        var addedItems:Vector.<int> = new Vector.<int>();
+        var i:int;
+        var count:int;
+        
+        if (!isEmpty(_selectedIndices) && !isEmpty(_proposedSelectedIndices))
+        {
+            // Changing selection, determine which items were added to the 
+            // selection interval 
+            count = _proposedSelectedIndices.length;
+            for (i = 0; i < count; i++)
+            {
+                if (_selectedIndices.indexOf(_proposedSelectedIndices[i]) < 0)
+                    addedItems.push(_proposedSelectedIndices[i]);
+            }
+            // Then determine which items were removed from the selection 
+            // interval 
+            count = _selectedIndices.length; 
+            for (i = 0; i < count; i++)
+            {
+                if (_proposedSelectedIndices.indexOf(_selectedIndices[i]) < 0)
+                    removedItems.push(_selectedIndices[i]);
+            }
+        }
+        else if (!isEmpty(_selectedIndices))
+        {
+            // Going to a null selection, remove all
+            removedItems = _selectedIndices;
+        }
+        else if (!isEmpty(_proposedSelectedIndices))
+        {
+            // Going from a null selection, add all
+            addedItems = _proposedSelectedIndices;
+        }
+
+        // Commit _selectedIndices before calling itemSelected() because
+        // selecting item renderers may cause updates that will check
+        // the value of _selectedIndices. Setting it first makes the
+        // indices consistent with the new selection values on the items.
+        _selectedIndices = _proposedSelectedIndices;
+         
+        // De-select the old items that were selected 
+        if (removedItems.length > 0)
+        {
+            count = removedItems.length;
+            for (i = 0; i < count; i++)
+            {
+                itemSelected(removedItems[i], false);
+            }
+        }
+        
+        // Select the new items in the new selection interval 
+        if (!isEmpty(_proposedSelectedIndices))
+        {
+            count = _proposedSelectedIndices.length;
+            for (i = 0; i < count; i++)
+            {
+                itemSelected(_proposedSelectedIndices[i], true);
+            }
+        }
+        
+        // Put _proposedSelectedIndices back to its default value.  
+        _proposedSelectedIndices = new Vector.<int>();
+    } */
+    
+    /**
+     *  @private
+     */
+    /* override protected function itemSelected(index:int, 
selected:Boolean):void
+    {
+        super.itemSelected(index, selected);
+        
+        var renderer:Object = dataGroup ? dataGroup.getElementAt(index) : null;
+        
+        if (renderer is IItemRenderer)
+        {
+            IItemRenderer(renderer).selected = selected;
+        }
+    } */
+    
+    /**
+     *  @private 
+     */
+    /* override protected function itemShowingCaret(index:int, 
showsCaret:Boolean):void
+    {
+        super.itemShowingCaret(index, showsCaret); 
+        
+        var renderer:Object = dataGroup ? dataGroup.getElementAt(index) : null;
+        
+        if (renderer is IItemRenderer)
+        {
+            IItemRenderer(renderer).showsCaret = showsCaret;
+        }
+    } */
+    
+    /**
+     *  @private
+     *  Scroll the dataGroup with ensureIndexIsVisible() until newCaretIndex 
+     *  is visible.  The process can be iterative and the new item renderers
+     *  are not guaranteed to be in place until after "updateComplete", i.e. 
+     *  after all layout phases have completed.
+     * 
+     *  Note also: we're selecting the item at newCaretIndex, even though it's
+     *  possible that - before the dataProvider refresh - the caretItem and
+     *  selectedItem were different. 
+     */
+    /* private function ensureCaretVisibility(newCaretIndex:int):void
+    {
+        setSelectedIndex(newCaretIndex, false);
+        ensureIndexIsVisible(newCaretIndex);        
+    }
+     */
+    /**
+     *  @private
+     *  At this point newCaretIndex is assumed to be visible, per a call to
+     *  ensureCaretVisibility().   Fine-tune the scroll position so that 
+     *  the itemRenderer at newCaretIndex appears at offsetX,Y relative 
+     *  to the dataGroup's upper left corner.
+     */
+    /* private function restoreCaretScrollPosition(newCaretIndex:int, 
offsetX:Number, offsetY:Number):void
+    {
+        const caretItemRenderer:IVisualElement = 
dataGroup.getElementAt(newCaretIndex);
+        if (!caretItemRenderer)
+            return;
+        
+        const newOffsetX:Number = caretItemRenderer.getLayoutBoundsX() - 
dataGroup.horizontalScrollPosition;
+        const newOffsetY:Number = caretItemRenderer.getLayoutBoundsY() - 
dataGroup.verticalScrollPosition;            
+        
+        dataGroup.verticalScrollPosition += newOffsetY - offsetY;
+        dataGroup.horizontalScrollPosition += newOffsetX - offsetX;
+    } */
+    
+    /**
+     *  @private
+     *  Adjust the scroll position so that the currently visible caret item, 
if any, 
+     *  still appears in the same relative position.   If the caret isn't 
currently 
+     *  visible then resort to the ListBase behavior, which is just to clear 
the selection
+     *  and scroll to 0,0.
+     * 
+     *  This method implements just one of several possible heuristics for 
adjusting
+     *  the scroll position after a dataProvider refresh.
+     */
+    /* override mx_internal function dataProviderRefreshed():void
+    {
+        // At this point the dataProvider's contents have changed but the 
dataGroup's 
+        // item renderers have not.  If the caret item renderer is visible, 
find 
+        // its x,y "offset" relative to the dataGroup's position and then 
scroll
+        // so that the new caret item renderer appears at the same offset.
+        
+        if ((caretItem !== undefined) && (dataGroup != null) && 
dataGroup.dataProvider)
+        {
+            const newCaretIndex:int = 
dataGroup.dataProvider.getItemIndex(caretItem);
+            const caretItemRenderer:IVisualElement = 
dataGroup.getElementAt(caretIndex);
+            
+            if ((newCaretIndex != -1) && 
dataGroup.isElementVisible(caretItemRenderer)) 
+            {
+                const caretItemRendererX:Number = 
caretItemRenderer.getLayoutBoundsX();
+                const caretItemRendererY:Number = 
caretItemRenderer.getLayoutBoundsY();
+            
+                const caretOffsetX:Number = caretItemRendererX - 
dataGroup.horizontalScrollPosition;
+                const caretOffsetY:Number = caretItemRendererY - 
dataGroup.verticalScrollPosition;
+                
+                // Wait for updateComplete before updating the scroll position 
to ensure 
+                // newCaretIndex is visible, so that other listeners/parts 
have completed
+                // their responses to the refresh event.
+                
+                const updateCompleteListenerA:Function = function():void {
+                                       if(dataGroup != null)
+                                       {
+                       
dataGroup.removeEventListener(FlexEvent.UPDATE_COMPLETE, 
updateCompleteListenerA, false);
+                                       }
+                    
+                                       ensureCaretVisibility(newCaretIndex);
+                                       
+                                       if(dataGroup != null)
+                                       {
+                                               
dataGroup.addEventListener(FlexEvent.UPDATE_COMPLETE, updateCompleteListenerB, 
false, 0, true);                    
+                                       }
+                    
+                };
+
+                // Wait for updateComplete before making the final update to 
the scroll position  
+                // so that layout bounds for the caret item renderer will have 
been computed.
+                
+                const updateCompleteListenerB:Function = function():void {
+                                       if(dataGroup != null)
+                                       {
+                                               
dataGroup.removeEventListener(FlexEvent.UPDATE_COMPLETE, 
updateCompleteListenerB, false);                    
+                                       }
+                    restoreCaretScrollPosition(newCaretIndex, caretOffsetX, 
caretOffsetY);
+                };
+                
+                dataGroup.addEventListener(FlexEvent.UPDATE_COMPLETE, 
updateCompleteListenerA, false, 0, true);
+                
+                return;
+            }
+        }
+
+        super.dataProviderRefreshed();  // clears the selectedIndex, caretIndex
+    } */
+    
+    /**
+     *  @private
+     */
+    /* override mx_internal function isItemIndexSelected(index:int):Boolean
+    {
+        if (allowMultipleSelection && (selectedIndices != null))
+            return selectedIndices.indexOf(index) != -1;
+        
+        return super.isItemIndexSelected(index);
+    } */
+    
+    /**
+     *  @private
+     */ 
+    /* override public function styleChanged(styleName:String):void
+    {
+        super.styleChanged(styleName);
+        
+        // The scrollPolicy styles are initialized in framework/defaults.css
+        // so there's no way to determine if been explicitly set here.  To 
avoid 
+        // preempting explicitly set scroller scrollPolicy styles with the 
default
+        // "auto" value, we only forward the style if it's not "auto".
+        
+        const allStyles:Boolean = (styleName == null || styleName == 
"styleName");
+        if (scroller)
+        {
+            const vsp:String = getStyle("verticalScrollPolicy");
+            if (styleName == "verticalScrollPolicy")
+                scroller.setStyle("verticalScrollPolicy", vsp);
+            else if (allStyles && vsp && (vsp !== ScrollPolicy.AUTO))
+                scroller.setStyle("verticalScrollPolicy", vsp);
+            
+            const hsp:String = getStyle("horizontalScrollPolicy");
+            if (styleName == "horizontalScrollPolicy")
+                scroller.setStyle("horizontalScrollPolicy", hsp);
+            else if (allStyles && hsp && (hsp !== ScrollPolicy.AUTO))
+                scroller.setStyle("horizontalScrollPolicy", hsp);
+        }
+    }     */
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Methods
+    //
+    
//--------------------------------------------------------------------------
+    
+    /**
+     *  @private
+     *  Returns the index of the last selected item. In single 
+     *  selection, this is just selectedIndex. In multiple 
+     *  selection, this is the index of the first selected item.  
+     */
+   /*  private function getLastSelectedIndex():int
+    {
+        if (selectedIndices && selectedIndices.length > 0)
+            return selectedIndices[selectedIndices.length - 1]; 
+        else 
+            return 0; 
+    }
+     */
+    /**
+     *  @private
+     *  Returns true if v is null or an empty Vector.
+     */
+    /* private function isEmpty(v:Vector.<int>):Boolean
+    {
+        return v == null || v.length == 0;
+    } */
+    
+    /**
+     *  Helper method to calculate how the current selection changes when an 
item is clicked.
+     *
+     *  @param index The index of the item that has been clicked.
+     *  @param shiftKey True when the shift key is pressed.
+     *  @param ctrlKey True when the control key is pressed.
+     *  @return The updated item indices that the new selection will be 
committed to.
+     * 
+     *  @see #selectedIndices
+     *   
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function calculateSelectedIndices(index:int, 
shiftKey:Boolean, ctrlKey:Boolean):Vector.<int>
+    {
+        var i:int; 
+        var interval:Vector.<int> = new Vector.<int>();  
+        
+        if (!shiftKey)
+        {
+            // TODO (rfrishbe): make this part a style, like 
"multipleSelectionRequiresModifierKey"
+            if (ctrlKey || getStyle("interactionMode") == 
InteractionMode.TOUCH)
+            {
+                if (!isEmpty(selectedIndices))
+                {
+                    // Quick check to see if selectedIndices had only one 
selected item
+                    // and that item was de-selected
+                    if (selectedIndices.length == 1 && (selectedIndices[0] == 
index))
+                    {
+                        // We need to respect requireSelection 
+                        if (!requireSelection)
+                            return interval; 
+                        else 
+                        {
+                            interval.splice(0, 0, selectedIndices[0]); 
+                            return interval; 
+                        }
+                    }
+                    else
+                    {
+                        // Go through and see if the index passed in was in 
the 
+                        // selection model. If so, leave it out when 
constructing
+                        // the new interval so it is de-selected. 
+                        var found:Boolean = false; 
+                        for (i = 0; i < _selectedIndices.length; i++)
+                        {
+                            if (_selectedIndices[i] == index)
+                                found = true; 
+                            else if (_selectedIndices[i] != index)
+                                interval.push(_selectedIndices[i]);
+                        }
+                        if (!found)
+                        {
+                            // Nothing from the selection model was 
de-selected. 
+                            // Instead, the Ctrl key was held down and we're 
doing a  
+                            // new add. 
+                            interval.splice(0, 0, index);   
+                        }
+                        return interval; 
+                    } 
+                }
+                // Ctrl+click with no previously selected items 
+                else
+                { 
+                    interval.splice(0, 0, index); 
+                    return interval; 
+            }
+            }
+            // A single item was newly selected, add that to the selection 
interval.  
+            else 
+            { 
+                interval.splice(0, 0, index); 
+                return interval; 
+        }
+        }
+        else // shiftKey
+        {
+            // A contiguous selection action has occurred. Figure out which 
new 
+            // indices to add to the selection interval and return that. 
+            var start:int = (!isEmpty(selectedIndices)) ? 
selectedIndices[selectedIndices.length - 1] : 0; 
+            var end:int = index; 
+            if (start < end)
+            {
+                for (i = start; i <= end; i++)
+                {
+                    interval.splice(0, 0, i); 
+                }
+            }
+            else 
+            {
+                for (i = start; i >= end; i--)
+                {
+                    interval.splice(0, 0, i); 
+                }
+            }
+            return interval; 
+        }
+    } */
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Drag methods
+    //
+    
//--------------------------------------------------------------------------
+    
+    /**
+     *  @private
+     *  The default handler for the <code>dragStart</code> event.
+     *
+     *  @param event The DragEvent object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    // protected function dragStartHandler(event:DragEvent):void
+    // {
+        // if (event.isDefaultPrevented())
+            // return;
+        
+        // var dragSource:DragSource = new DragSource();
+        // addDragData(dragSource);
+        // DragManager.doDrag(this, 
+                           // dragSource, 
+                           // event, 
+                           // createDragIndicator(), 
+                           // 0 /*xOffset*/, 
+                           // 0 /*yOffset*/, 
+                           // 0.5 /*imageAlpha*/, 
+                           // dragMoveEnabled);
+    // } 
+    
+    /**
+     *  @private
+     *  Used to sort the selected indices during drag and drop operations.
+     */
+    /* private function compareValues(a:int, b:int):int
+    {
+        return a - b;
+    }  */
+    
+    /**
+     *  @private
+     *  Handles <code>DragEvent.DRAG_COMPLETE</code> events.  This method
+     *  removes the items from the data provider.
+     *
+     *  @param event The DragEvent object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function dragCompleteHandler(event:DragEvent):void
+    {
+        if (event.isDefaultPrevented())
+            return;
+        
+        // Remove the dragged items only if they were drag moved to
+        // a different list. If the items were drag moved to this
+        // list, the reordering was already handles in the 
+        // DragEvent.DRAG_DROP listener.
+        if (!dragMoveEnabled ||
+            event.action != DragManager.MOVE || 
+            event.relatedObject == this)
+            return;
+        
+        // Clear the selection, but remember which items were moved
+        var movedIndices:Vector.<int> = selectedIndices;
+        setSelectedIndices(new Vector.<int>(), true);
+        validateProperties(); // To commit the selection
+        
+        // Remove the moved items
+        movedIndices.sort(compareValues);
+        var count:int = movedIndices.length;
+        for (var i:int = count - 1; i >= 0; i--)
+        {
+            dataProvider.removeItemAt(movedIndices[i]);
+        }
+    } */
+    
+    /**
+     *  Creates an instance of a class that is used to display the visuals
+     *  of the dragged items during a drag and drop operation.
+     *  The default <code>DragEvent.DRAG_START</code> handler passes the
+     *  instance to the <code>DragManager.doDrag()</code> method.
+     *
+     *  @return The IFlexDisplayObject representing the drag indicator.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function createDragIndicator():IFlexDisplayObject
+    {
+        var dragIndicator:IFlexDisplayObject;
+        var dragIndicatorClass:Class = Class(getStyle("dragIndicatorClass"));
+        if (dragIndicatorClass)
+        {
+            dragIndicator = new dragIndicatorClass();
+            if (dragIndicator is IVisualElement)
+                IVisualElement(dragIndicator).owner = this;
+        }
+        
+        return dragIndicator;
+    } */
+
+    /**
+     *  Adds the selected items to the DragSource object as part of
+     *  a drag-and-drop operation.
+     *  Override this method to add other data to the drag source.
+     * 
+     *  @param ds The DragSource object to which to add the data.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function addDragData(dragSource:DragSource):void
+    {
+        dragSource.addHandler(copySelectedItemsForDragDrop, "itemsByIndex");
+        
+        // Calculate the index of the focus item within the vector
+        // of ordered items returned for the "itemsByIndex" format.
+        var caretIndex:int = 0;
+        var draggedIndices:Vector.<int> = selectedIndices;
+        var count:int = draggedIndices.length;
+        for (var i:int = 0; i < count; i++)
+        {
+            if (mouseDownIndex > draggedIndices[i])
+                caretIndex++;
+        }
+        dragSource.addData(caretIndex, "caretIndex");
+    } */
+
+    /**
+     *  @private
+     */
+    /* private function copySelectedItemsForDragDrop():Vector.<Object>
+    {
+        // Copy the vector so that we don't modify the original
+         // since selectedIndices returns a reference.
+        var draggedIndices:Vector.<int> = selectedIndices.slice(0, 
selectedIndices.length);
+        var result:Vector.<Object> = new 
Vector.<Object>(draggedIndices.length);
+
+        // Sort in the order of the data source
+        draggedIndices.sort(compareValues);
+        
+        // Copy the items
+        var count:int = draggedIndices.length;
+        for (var i:int = 0; i < count; i++)
+            result[i] = dataProvider.getItemAt(draggedIndices[i]);  
+        return result;
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>MouseEvent.MOUSE_DOWN</code> events from any of the 
+     *  item renderers. This method handles the updating and commitment 
+     *  of selection as well as remembers the mouse down point and
+     *  attaches <code>MouseEvent.MOUSE_MOVE</code> and
+     *  <code>MouseEvent.MOUSE_UP</code> listeners in order to handle
+     *  drag gestures.
+     *
+     *  @param event The MouseEvent object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function item_mouseDownHandler(event:MouseEvent):void
+    {
+        // someone else handled it already since this is cancellable thanks to 
+        // some extra code in SystemManager that redispatches a cancellable 
version 
+        // of the same event
+        if (event.isDefaultPrevented())
+            return;
+        
+        // Handle the fixup of selection
+        var newIndex:int;
+        if (event.currentTarget is IItemRenderer)
+            newIndex = IItemRenderer(event.currentTarget).itemIndex;
+        else
+            newIndex = dataGroup.getElementIndex(event.currentTarget as 
IVisualElement);
+        
+        if (!allowMultipleSelection)
+        {
+            // Single selection case, set the selectedIndex 
+            
+            // Check to see if we're deselecting the currently selected item 
because if we're 
+            // possibly dragging we don't want to de-select this immediately.  
Similarly, if we 
+            // are in touch interactionMode, we need to delay the item 
renderer highlight for a bit 
+            if ((event.ctrlKey && selectedIndex == newIndex) || 
getStyle("interactionMode") == InteractionMode.TOUCH)
+            {
+                // Immediately unselect if we don't support dragging. 
+                if (!dragEnabled && getStyle("interactionMode") != 
InteractionMode.TOUCH)
+                {
+                    setSelectedIndex(NO_SELECTION, true);    
+                }
+                else
+                {
+                    pendingSelectionOnMouseUp = true;
+                    pendingSelectionCtrlKey = event.ctrlKey;
+                    pendingSelectionShiftKey = event.shiftKey;
+                }
+            }
+            else
+            {
+                setSelectedIndex(newIndex, true);
+            }
+        }
+        else 
+        {
+            // Don't commit the selection immediately, but wait to see if the 
user
+            // is actually dragging. If they don't drag, then commit the 
selection
+            if (isItemIndexSelected(newIndex) || getStyle("interactionMode") 
== InteractionMode.TOUCH)
+            {
+                pendingSelectionOnMouseUp = true;
+                pendingSelectionShiftKey = event.shiftKey;
+                pendingSelectionCtrlKey = event.ctrlKey;
+            }
+            else
+            {
+                setSelectedIndices(calculateSelectedIndices(newIndex, 
event.shiftKey, event.ctrlKey), true);
+            }
+        }
+        
+        // If selection is pending on mouse up then we have just moused down on
+        // an item, part of an already commited selection.
+        // However if we moused down on an item that's not currently selected,
+        // we must commit the selection before trying to start dragging since
+        // listeners may prevent the item from being selected.
+        if (!pendingSelectionOnMouseUp)
+            validateProperties();
+        
+        mouseDownPoint = event.target.localToGlobal(new Point(event.localX, 
event.localY));
+        mouseDownObject = event.currentTarget as DisplayObject;
+        mouseDownIndex = newIndex;
+        
+        var listenForDrag:Boolean = (dragEnabled && 
getStyle("interactionMode") == InteractionMode.MOUSE && selectedIndices && 
this.selectedIndices.indexOf(newIndex) != -1);
+        // Handle any drag gestures that may have been started
+        if (listenForDrag)
+        {
+            // Listen for MOUSE_MOVE on the sandboxRoot.
+            // The user may have cliked on the item renderer close
+            // to the edge of the list, and we still want to start a drag
+            // operation if they move out of the list.
+            
systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_MOVE, 
mouseMoveHandler, false, 0, true);
+        }
+        
+        if (pendingSelectionOnMouseUp || listenForDrag)
+        {
+            
systemManager.getSandboxRoot().addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE,
 mouseUpHandler, false, 0, true);
+            
systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP, 
mouseUpHandler, false, 0, true);
+        }
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>MouseEvent.MOUSE_MOVE</code> events from any mouse
+     *  targets contained in the list including the renderers.  This method
+     *  watches for a gesture that constitutes the beginning of a
+     *  drag drop and send a <code>DragEvent.DRAG_START</code> event.
+     *  It also checks to see if the mouse is over a non-target area of a
+     *  renderer so that Flex can try to make it look like that renderer was 
+     *  the target.
+     *
+     *  @param event The MouseEvent object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function mouseMoveHandler(event:MouseEvent):void
+    {
+        if (!mouseDownPoint || !dragEnabled)
+            return;
+        
+        var pt:Point = new Point(event.localX, event.localY);
+        pt = DisplayObject(event.target).localToGlobal(pt);
+        
+        const DRAG_THRESHOLD:int = 5;
+        
+        if (Math.abs(mouseDownPoint.x - pt.x) > DRAG_THRESHOLD ||
+            Math.abs(mouseDownPoint.y - pt.y) > DRAG_THRESHOLD)
+        {
+            var dragEvent:DragEvent = new DragEvent(DragEvent.DRAG_START);
+            dragEvent.dragInitiator = this;
+            
+            var localMouseDownPoint:Point = this.globalToLocal(mouseDownPoint);
+            
+            dragEvent.localX = localMouseDownPoint.x;
+            dragEvent.localY = localMouseDownPoint.y;
+            dragEvent.buttonDown = true;
+            
+            // We're starting a drag operation, remove the handlers
+            // that are monitoring the mouse move, we don't need them anymore:
+            dispatchEvent(dragEvent);
+
+            // Finally, remove the mouse handlers
+            removeMouseHandlersForDragStart(event);
+        }
+    }
+    
+    private function removeMouseHandlersForDragStart(event:Event):void
+    {
+        // If dragging failed, but we had a pending selection, commit it here
+        if (pendingSelectionOnMouseUp && !DragManager.isDragging)
+        {
+            if (getStyle("interactionMode") == InteractionMode.TOUCH)
+            {
+                // if in touch mode, and we didn't start scrolling, let's 
check to see
+                // whether we moused up on the same item we mouse downed on. 
+                // we don't do this check for mouse mode because technically 
selection happens 
+                // on mousedown there.
+                
+                // this selectionChange check is basically a "click" check to 
make sure we moused downed on 
+                // the same item that we moused up on.
+                // We could just put it in click handler, but this is a little 
easier in mouseup
+                // since we've combined some dragging logic and some touch 
interaction 
+                // logic around pendingSelectionOnMouseUp.
+                var selectionChange:Boolean = (event.target == mouseDownObject 
|| 
+                    (mouseDownObject is DisplayObjectContainer && 
+                        
DisplayObjectContainer(mouseDownObject).contains(event.target as 
DisplayObject)));
+                
+                // check to make sure they clicked on an item and selection 
should change
+                if (selectionChange)
+                {
+                    // now handle the cases where the item is being selected 
or de-selected
+                    // based on allowMultipleSelection
+                    if (allowMultipleSelection)
+                    {
+                        
setSelectedIndices(calculateSelectedIndices(mouseDownIndex, 
pendingSelectionShiftKey, pendingSelectionCtrlKey), true);
+                    }
+                    else
+                    {
+                        setSelectedIndex(mouseDownIndex, true);
+                    }
+                }
+            }
+            else
+            {
+                // if in mouse interactionMode, we must have finished an 
attempted drag, so let's
+                // select the item if in multi-select mode or de-select the 
item 
+                // if in single select mode.  See item_mouseDownHandler for 
how this was setup
+                if (allowMultipleSelection)
+                {
+                    
setSelectedIndices(calculateSelectedIndices(mouseDownIndex, 
pendingSelectionShiftKey, pendingSelectionCtrlKey), true);
+                }
+                else
+                {
+                    // Must be deselecting the current selected item since the 
only
+                    // reason we are here could be dragging
+                    setSelectedIndex(NO_SELECTION, true);
+                }
+            }
+        }
+
+        // Always clean up the flag, even if currently dragging.
+        pendingSelectionOnMouseUp = false;
+        
+        mouseDownPoint = null;
+        mouseDownObject = null;
+        mouseDownIndex = -1;
+        
+        
systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_MOVE, 
mouseMoveHandler, false);
+        
systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP, 
mouseUpHandler, false);
+        
systemManager.getSandboxRoot().removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE,
 mouseUpHandler, false);
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>MouseEvent.MOUSE_DOWN</code> events from any mouse
+     *  targets contained in the list including the renderers. This method
+     *  finds the renderer that was pressed and prepares to receive
+     *  a <code>MouseEvent.MOUSE_UP</code> event.
+     *
+     *  @param event The MouseEvent object.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function mouseUpHandler(event:Event):void
+    {
+        removeMouseHandlersForDragStart(event);
+    } */
+    
+    
//--------------------------------------------------------------------------
+    //
+    //  Drop methods
+    //
+    
//--------------------------------------------------------------------------
+    
+    /* private function calculateDropLocation(event:DragEvent):DropLocation
+    {
+        // Verify data format
+        if (!enabled || !event.dragSource.hasFormat("itemsByIndex"))
+            return null;
+        
+        // Calculate the drop location
+        return layout.calculateDropLocation(event);
+    } */
+
+    /**
+     *  Creates and instance of the dropIndicator class that is used to
+     *  display the visuals of the drop location during a drag and drop
+     *  operation. The instance is set in the layout's 
+     *  <code>dropIndicator</code> property.
+     *
+     *  <p>If you override the <code>dragEnter</code> event handler, 
+     *  and call <code>preventDefault()</code> so that the default handler 
does not execute, 
+     *  call <code>createDropIndicator()</code> to create the drop 
indicator.</p>
+     * 
+     *  @return Returns the dropIndicator that was set in the layout.
+     *
+     *  @see #destroyDropIndicator
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function createDropIndicator():DisplayObject
+    {
+        // Do we have a drop indicator already?
+        if (layout.dropIndicator)
+            return layout.dropIndicator;
+        
+        var dropIndicatorInstance:DisplayObject;
+        if (dropIndicator)
+        {
+            dropIndicatorInstance = 
DisplayObject(createDynamicPartInstance("dropIndicator"));
+        }
+        else
+        {
+            var dropIndicatorClass:Class = 
Class(getStyle("dropIndicatorSkin"));
+            if (dropIndicatorClass)
+                dropIndicatorInstance = new dropIndicatorClass();
+        }
+        if (dropIndicatorInstance is IVisualElement)
+            IVisualElement(dropIndicatorInstance).owner = this;
+
+        // Set it in the layout
+        layout.dropIndicator = dropIndicatorInstance;
+        return dropIndicatorInstance;
+    } */
+    
+    /**
+     *  Releases the <code>dropIndicator</code> instance that is currently set 
in the layout.
+     *
+     *  <p>If you override the <code>dragExit</code> event handler, 
+     *  and call <code>preventDefault()</code> so that the default handler 
does not execute, 
+     *  call <code>destroyDropIndicator()</code> to delete the drop 
indicator.</p>
+     *
+     *  @return Returns the dropIndicator that was removed. 
+     * 
+     *  @see #createDropIndicator
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function destroyDropIndicator():DisplayObject
+    {
+        var dropIndicatorInstance:DisplayObject = layout.dropIndicator;
+        if (!dropIndicatorInstance)
+            return null;
+        
+        // Release the reference from the layout
+        layout.dropIndicator = null;
+        
+        // Release it if it's a dynamic skin part
+        var count:int = numDynamicParts("dropIndicator");
+        for (var i:int = 0; i < count; i++)
+        {
+            if (dropIndicatorInstance == getDynamicPartAt("dropIndicator", i))
+            {
+                // This was a dynamic part, remove it now:
+                removeDynamicPartInstance("dropIndicator", 
dropIndicatorInstance);
+                break;
+            }
+        }
+        return dropIndicatorInstance;
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>DragEvent.DRAG_ENTER</code> events.  This method
+     *  determines if the DragSource object contains valid elements and uses
+     *  the <code>DragManager.showDropFeedback()</code> method to set up the 
+     *  UI feedback as well as the layout's <code>showDropIndicator()</code>
+     *  method to display the drop indicator and initiate drag scrolling.
+     *
+     *  @param event The DragEvent object.
+     * 
+     *  @see spark.layouts.LayoutBase#showDropIndicator
+     *  @see spark.layouts.LayoutBase#hideDropIndicator
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function dragEnterHandler(event:DragEvent):void
+    {
+        if (event.isDefaultPrevented())
+            return;
+        
+        var dropLocation:DropLocation = calculateDropLocation(event); 
+        if (dropLocation)
+        {
+            DragManager.acceptDragDrop(this);
+            
+            // Create the dropIndicator instance. The layout will take care of
+            // parenting, sizing, positioning and validating the dropIndicator.
+            createDropIndicator();
+            
+            // Show focus
+            drawFocusAnyway = true;
+            drawFocus(true);
+            
+            // Notify manager we can drop
+            DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : 
DragManager.MOVE);
+
+            // Show drop indicator
+            layout.showDropIndicator(dropLocation);
+        }
+        else
+        {
+            DragManager.showFeedback(DragManager.NONE);
+        }
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>DragEvent.DRAG_OVER</code> events. This method
+     *  determines if the DragSource object contains valid elements and uses
+     *  the <code>showDropFeedback()</code> method to set up the UI feedback 
+     *  as well as the layout's <code>showDropIndicator()</code> method
+     *  to display the drop indicator and initiate drag scrolling.
+     *
+     *  @param event The DragEvent object.
+     *  
+     *  @see spark.layouts.LayoutBase#showDropIndicator
+     *  @see spark.layouts.LayoutBase#hideDropIndicator
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function dragOverHandler(event:DragEvent):void
+    {
+        if (event.isDefaultPrevented())
+            return;
+        
+        var dropLocation:DropLocation = calculateDropLocation(event);
+        if (dropLocation)
+        {
+            // Show focus
+            drawFocusAnyway = true;
+            drawFocus(true);
+            
+            // Notify manager we can drop
+            DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : 
DragManager.MOVE);
+
+            // Show drop indicator
+            layout.showDropIndicator(dropLocation);
+        }
+        else
+        {
+            // Hide if previously showing
+            layout.hideDropIndicator();
+
+            // Hide focus
+            drawFocus(false);
+            drawFocusAnyway = false;
+            
+            // Notify manager we can't drop
+            DragManager.showFeedback(DragManager.NONE);
+        }
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>DragEvent.DRAG_EXIT</code> events. This method hides
+     *  the UI feedback by calling the <code>hideDropFeedback()</code> method
+     *  and also hides the drop indicator by calling the layout's 
+     *  <code>hideDropIndicator()</code> method.
+     *
+     *  @param event The DragEvent object.
+     *  
+     *  @see spark.layouts.LayoutBase#showDropIndicator
+     *  @see spark.layouts.LayoutBase#hideDropIndicator
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function dragExitHandler(event:DragEvent):void
+    {
+        if (event.isDefaultPrevented())
+            return;
+        
+        // Hide if previously showing
+        layout.hideDropIndicator();
+        
+        // Hide focus
+        drawFocus(false);
+        drawFocusAnyway = false;
+        
+        // Destroy the dropIndicator instance
+        destroyDropIndicator();
+    } */
+    
+    /**
+     *  @private
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* private function 
touchInteractionStartHandler(event:TouchInteractionEvent):void
+    {
+        // cancel actual selection
+        mouseDownIndex = -1;
+        mouseDownObject = null;
+        mouseDownPoint = null;
+        pendingSelectionOnMouseUp = false;
+    } */
+    
+    /**
+     *  @private
+     *  Handles <code>DragEvent.DRAG_DROP events</code>. This method  hides
+     *  the drop feedback by calling the <code>hideDropFeedback()</code> 
method.
+     *
+     *  <p>If the action is a <code>COPY</code>, 
+     *  then this method makes a deep copy of the object 
+     *  by calling the <code>ObjectUtil.copy()</code> method, 
+     *  and replaces the copy's <code>uid</code> property (if present) 
+     *  with a new value by calling the <code>UIDUtil.createUID()</code> 
method.</p>
+     * 
+     *  @param event The DragEvent object.
+     *
+     *  @see mx.utils.ObjectUtil
+     *  @see mx.utils.UIDUtil
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function dragDropHandler(event:DragEvent):void
+    {
+        if (event.isDefaultPrevented())
+            return;
+        
+        // Hide the drop indicator
+        layout.hideDropIndicator();
+        destroyDropIndicator();
+        
+        // Hide focus
+        drawFocus(false);
+        drawFocusAnyway = false;
+        
+        // Get the dropLocation
+        var dropLocation:DropLocation = calculateDropLocation(event);
+        if (!dropLocation)
+            return;
+        
+        // Find the dropIndex
+        var dropIndex:int = dropLocation.dropIndex;
+        
+        // Make sure the manager has the appropriate action
+        DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : 
DragManager.MOVE);
+        
+        var dragSource:DragSource = event.dragSource;
+        var items:Vector.<Object> = dragSource.dataForFormat("itemsByIndex") 
as Vector.<Object>;
+
+        var caretIndex:int = -1;
+        if (dragSource.hasFormat("caretIndex"))
+            caretIndex = event.dragSource.dataForFormat("caretIndex") as int;
+        
+        // Clear the selection first to avoid extra work while adding and 
removing items.
+        // We will set a new selection further below in the method.
+        var indices:Vector.<int> = selectedIndices; 
+        setSelectedIndices(new Vector.<int>(), false);
+        validateProperties(); // To commit the selection
+        
+        // If we are reordering the list, remove the items now,
+        // adjusting the dropIndex in the mean time.
+        // If the items are drag moved to this list from a different list,
+        // the drag initiator will remove the items when it receives the
+        // DragEvent.DRAG_COMPLETE event.
+        if (dragMoveEnabled &&
+            event.action == DragManager.MOVE &&
+            event.dragInitiator == this)
+        {
+            // Remove the previously selected items
+            indices.sort(compareValues);
+            for (var i:int = indices.length - 1; i >= 0; i--)
+            {
+                if (indices[i] < dropIndex)
+                    dropIndex--;
+                dataProvider.removeItemAt(indices[i]);
+            }
+        }
+        
+        // Drop the items at the dropIndex
+        var newSelection:Vector.<int> = new Vector.<int>();
+
+        // Update the selection with the index of the caret item
+        if (caretIndex != -1)
+            newSelection.push(dropIndex + caretIndex);
+
+        // Create dataProvider if needed
+        if (!dataProvider)
+            dataProvider = new ArrayCollection();
+        
+        var copyItems:Boolean = (event.action == DragManager.COPY);
+        for (i = 0; i < items.length; i++)
+        {
+            // Get the item, clone if needed
+            var item:Object = items[i];
+            if (copyItems)
+                item = copyItemWithUID(item);
+
+            // Copy the data
+            dataProvider.addItemAt(item, dropIndex + i);
+
+            // Update the selection
+            if (i != caretIndex)
+                newSelection.push(dropIndex + i);
+        }
+
+        // Set the selection
+        setSelectedIndices(newSelection, false);
+
+        // Scroll the caret index in view
+        if (caretIndex != -1)
+        {
+            // Sometimes we may need to scroll several times as for virtual 
layouts
+            // this is not guaranteed to bring in the element in view the 
first try
+            // as some items in between may not be loaded yet and their size 
is only
+            // estimated.
+            var delta:Point;
+            var loopCount:int = 0;
+            while (loopCount++ < 10)
+            {
+                validateNow();
+                delta = layout.getScrollPositionDeltaToElement(dropIndex + 
caretIndex);
+                if (!delta || (delta.x == 0 && delta.y == 0))
+                    break;
+                layout.horizontalScrollPosition += delta.x;
+                layout.verticalScrollPosition += delta.y;
+            }
+        }
+    }
+       */
+    /**
+     *  Makes a deep copy of the object by calling the 
+     *  <code>ObjectUtil.copy()</code> method, and replaces 
+     *  the copy's <code>uid</code> property (if present) with a 
+     *  new value by calling the <code>UIDUtil.createUID()</code> method.
+     * 
+     *  <p>This method is used for a drag and drop copy.</p>
+     * 
+     *  @param item The item to copy.
+     *  
+     *  @return The copy of the object.
+     *
+     *  @see mx.utils.ObjectUtil
+     *  @see mx.utils.UIDUtil
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function copyItemWithUID(item:Object):Object
+    {
+        var copyObj:Object = ObjectUtil.copy(item);
+        
+        if (copyObj is IUID)
+        {
+            IUID(copyObj).uid = UIDUtil.createUID();
+        }
+        else if (copyObj is Object && "mx_internal_uid" in copyObj)
+        {
+            copyObj.mx_internal_uid = UIDUtil.createUID();
+        }
+        
+        return copyObj;
+    } */
+
+    
//--------------------------------------------------------------------------
+    //
+    //  Event Handlers
+    //
+    
//--------------------------------------------------------------------------
+    
+    /**
+     *  @private
+     *  Called when an item has been added to this component.
+     */
+    /* override protected function 
dataGroup_rendererAddHandler(event:RendererExistenceEvent):void
+    {
+        super.dataGroup_rendererAddHandler(event);
+        
+        var renderer:IVisualElement = event.renderer;
+        
+        if (!renderer)
+            return;
+        
+        renderer.addEventListener(MouseEvent.MOUSE_DOWN, 
item_mouseDownHandler);
+    } */
+    
+    /**
+     *  @private
+     *  Called when an item has been removed from this component.
+     */
+    /* override protected function 
dataGroup_rendererRemoveHandler(event:RendererExistenceEvent):void
+    {
+        super.dataGroup_rendererRemoveHandler(event);
+        
+        var renderer:Object = event.renderer;
+        
+        if (!renderer)
+            return;
+        
+        renderer.removeEventListener(MouseEvent.MOUSE_DOWN, 
item_mouseDownHandler);
+    } */
+    
+    /**
+     *  A convenience method that handles scrolling a data item
+     *  into view. 
+     * 
+     *  If the data item at the specified index is not completely 
+     *  visible, the List scrolls until it is brought into 
+     *  view. If the data item is already in view, no additional
+     *  scrolling occurs. 
+     * 
+     *  @param index The index of the data item.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* public function ensureIndexIsVisible(index:int):void
+    {
+        if (!layout)
+            return;
+
+        var spDelta:Point = 
dataGroup.layout.getScrollPositionDeltaToElement(index);
+         
+        if (spDelta)
+        {
+            dataGroup.horizontalScrollPosition += spDelta.x;
+            dataGroup.verticalScrollPosition += spDelta.y;
+        }
+    } */
+    
+    /**
+     *  Adjusts the selected indices to account for items being added to or 
+     *  removed from this component. 
+     *   
+     *  @param index The new index.
+     *   
+     *  @param add <code>true</code> if an item was added to the component, 
+     *  and <code>false</code> if an item was removed.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* override protected function adjustSelection(index:int, 
add:Boolean=false):void
+    {
+        var i:int; 
+        var curr:Number; 
+        var newInterval:Vector.<int> = new Vector.<int>(); 
+        var e:IndexChangeEvent; 
+        
+        if (selectedIndex == NO_SELECTION || doingWholesaleChanges)
+        {
+            // The case where one item has been newly added and it needs to be 
+            // selected and careted because requireSelection is true. 
+            if (dataProvider && dataProvider.length == 1 && requireSelection)
+            {
+                newInterval.push(0);
+                _selectedIndices = newInterval;   
+                _selectedIndex = 0; 
+                itemShowingCaret(0, true); 
+                // If the selection properties have been adjusted to account 
for items that
+                // have been added or removed, send out a "valueCommit" event 
and 
+                // "caretChange" event so any bindings to them are updated 
correctly.
+                 
+                dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
+                
+                e = new IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
+                e.oldIndex = -1; 
+                e.newIndex = _caretIndex;
+                dispatchEvent(e); 
+            }
+            return; 
+        }
+        
+        // Ensure multiple and single selection are in-sync before adjusting  
+        // selection. Sometimes if selection has been changed before 
adding/removing
+        // an item, we may not have handled selection via invalidation, so in 
those 
+        // cases, force a call to commitSelection() to validate and commit the 
selection. 
+        if ((!selectedIndices && selectedIndex > NO_SELECTION) ||
+            (selectedIndex > NO_SELECTION && 
selectedIndices.indexOf(selectedIndex) == -1))
+        {
+            commitSelection(); 
+        }
+        
+        // Handle the add or remove and adjust selection accordingly. 
+        if (add)
+        {
+            for (i = 0; i < selectedIndices.length; i++)
+            {
+                curr = selectedIndices[i];
+                 
+                // Adding an item above one of the selected items,
+                // bump the selected item up. 
+                if (curr >= index)
+                    newInterval.push(curr + 1); 
+                else 
+                    newInterval.push(curr); 
+            }
+        }
+        else
+        {
+            // Quick check to see if we're removing the only selected item
+            // in which case we need to honor requireSelection. 
+            if (!isEmpty(selectedIndices) && selectedIndices.length == 1 
+                && index == selectedIndex && requireSelection)
+            {
+                //Removing the last item 
+                if (dataProvider.length == 0)
+                {
+                    newInterval = new Vector.<int>(); 
+                }
+                else
+                {
+                    // We can't just set selectedIndex to 0 directly
+                    // since the previous value was 0 and the new value is
+                    // 0, so the setter will return early.
+                    _proposedSelectedIndex = 0; 
+                    invalidateProperties();
+                    
+                    if (index == 0)
+                        return;
+
+                    newInterval.push(0);  
+                }
+            }
+            else
+            {    
+                for (i = 0; i < selectedIndices.length; i++)
+                {
+                    curr = selectedIndices[i]; 
+                    // Removing an item above one of the selected items,
+                    // bump the selected item down. 
+                    if (curr > index)
+                        newInterval.push(curr - 1); 
+                    else if (curr < index) 
+                        newInterval.push(curr);
+                }
+            }
+        }
+        
+        if (caretIndex == selectedIndex)
+        {
+            // caretIndex is not changing, so we just need to dispatch
+            // an "caretChange" event to update any bindings and update the 
+            // caretIndex backing variable. 
+            var oldIndex:Number = caretIndex; 
+            _caretIndex = VectorUtil.getFirstItem(newInterval);
+            e = new IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
+            e.oldIndex = oldIndex; 
+            e.newIndex = caretIndex; 
+            dispatchEvent(e); 
+        }
+        else 
+        {
+            // De-caret the previous caretIndex renderer and set the 
+            // caretIndexAdjusted flag to true. This will mean in 
+            // commitProperties, the caretIndex will be adjusted to 
+            // match the selectedIndex; 
+            
+            // TODO (dsubrama): We should revisit the synchronous nature of 
the 
+            // de-careting/re-careting behavior.
+            itemShowingCaret(caretIndex, false); 
+            caretIndexAdjusted = true; 
+            invalidateProperties(); 
+        }
+        
+        var oldIndices:Vector.<int> = selectedIndices;  
+        _selectedIndices = newInterval;
+        _selectedIndex = VectorUtil.getFirstItem(newInterval);
+        // If the selection has actually changed, trigger a pass to 
+        // commitProperties where a change event will be 
+        // fired to update any bindings to selection properties. 
+        if (_selectedIndices != oldIndices)
+        {
+            selectedIndexAdjusted = true; 
+            invalidateProperties(); 
+        }
+    } */
+    
+    /**
+     *  Tries to find the next item in the data provider that
+     *  starts with the character in the <code>eventCode</code> parameter.
+     *  You can override this method to perform custom typeahead lookups. 
+     *  The search starts at the <code>selectedIndex</code> location.
+     *  If it reaches the end of the data provider, it starts over from the 
beginning.
+     *
+     *  @param eventCode The key that was pressed on the keyboard.
+     *  @return <code>true</code> if a match was found.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* mx_internal function findKey(eventCode:int):Boolean
+    {
+        var tmpCode:int = eventCode;
+        
+        return tmpCode >= 33 &&
+               tmpCode <= 126 &&
+               findString(String.fromCharCode(tmpCode));
+    } */
+    
+    /**
+     *  Finds an item in the list based on a String,
+     *  and moves the selection to it. The search
+     *  starts at the <code>selectedIndex</code> location.
+     *  If it reaches the end of the data provider, it starts over from the 
beginning.
+     *
+     *  @param str The String to match.
+     * 
+     *  @return <code>true</code> if a match is found.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* mx_internal function findString(str:String):Boolean
+    {
+        if (!dataProvider || dataProvider.length == 0)
+            return false;
+
+        var startIndex:int;
+        var stopIndex:int;
+        var retVal:Number;  
+
+        if (selectedIndex == NO_SELECTION || selectedIndex == 
CUSTOM_SELECTED_ITEM)
+        {
+            startIndex = 0;
+            stopIndex = dataProvider.length; 
+            retVal = findStringLoop(str, startIndex, stopIndex);
+        }
+        else
+        {
+            startIndex = selectedIndex + 1; 
+            stopIndex = dataProvider.length; 
+            retVal = findStringLoop(str, startIndex, stopIndex); 
+            // We didn't find the item, loop back to the top 
+            if (retVal == -1)
+            {
+                retVal = findStringLoop(str, 0, selectedIndex); 
+            }
+        }
+        if (retVal != -1)
+        {
+            setSelectedIndex(retVal, true);
+            ensureIndexIsVisible(retVal); 
+            return true; 
+        }
+        else 
+            return false; 
+    } */
+    
+    /**
+     *  @private
+     */
+    /* mx_internal function findStringLoop(str:String, startIndex:int, 
stopIndex:int):Number
+    {
+        // Try to find the item based on the start and stop indices
+        for (startIndex; startIndex != stopIndex; startIndex++)
+        {
+            var itmStr:String = 
itemToLabel(dataProvider.getItemAt(startIndex));
+
+            itmStr = itmStr.substring(0, str.length);
+            if (str == itmStr || str.toUpperCase() == itmStr.toUpperCase())
+            {
+               return startIndex;
+            }
+        }
+        return -1;
+    } */
+    
+    /**
+     *  @private
+     *  Build in basic keyboard navigation support in List. 
+     */
+    /* override protected function keyDownHandler(event:KeyboardEvent):void
+    {   
+        super.keyDownHandler(event);
+        
+        if (!dataProvider || !layout || event.isDefaultPrevented())
+            return;
+            
+        // In lue of a formal item editor architecture (pending), we will
+        // defer all keyboard events to the target if the target happens to 
+        // be an editable input control.
+        if (isEditableTarget(event.target))
+            return;
+        
+        var touchMode:Boolean = getStyle("interactionMode") == 
InteractionMode.TOUCH;
+        
+        // 1. Was the space bar hit? or was the enter key hit and we're in 
5-way mode
+        // Hitting the space bar means the current caret item, 
+        // that is the item currently in focus, is being 
+        // selected or de-selected. 
+        if (event.keyCode == Keyboard.SPACE ||
+            (touchMode && event.keyCode == Keyboard.ENTER))
+        {
+            if (allowMultipleSelection)
+            {
+                // Need to set "changeCaret" to false below so that we 
+                // don't change the caret to an item in the selectedIndices
+                // if we are currently deselecting an item
+                setSelectedIndices(calculateSelectedIndices(caretIndex, 
event.shiftKey, event.ctrlKey), true, false);
+            }
+            else
+            {
+                // check to see if we're de-selecting the current item
+                if (caretIndex == selectedIndex && (event.ctrlKey || 
touchMode))
+                {
+                    // Unselect it, but don't change the caret
+                    setSelectedIndex(NO_SELECTION, true, false);
+                }
+                else
+                {
+                    // select the current item
+                    setSelectedIndex(caretIndex, true, false);
+                }
+                
+            }
+            event.preventDefault();
+            return; 
+        }
+
+        // 2. Or was an alphanumeric key hit? 
+        // Hitting an alphanumeric key causes List's
+        // findKey method to run to find a matching 
+        // item in the dataProvider whose first char 
+        // matches the keystroke. 
+        if (findKey(event.charCode))
+        {
+            event.preventDefault();
+            return;
+        }
+            
+        // 3. Was a navigation key hit (like an arrow key,
+        // or Shift+arrow key)?  
+        // Delegate to the layout to interpret the navigation
+        // key and adjust the selection and caret item based
+        // on the combination of keystrokes encountered.      
+        adjustSelectionAndCaretUponNavigation(event); 
+    } */
+    
+    /**
+     *  Adjusts the selection based on what keystroke or 
+     *  keystroke combinations were encountered. The keystroke
+     *  is sent down to the layout and it is up to the layout's
+     *  getNavigationDestinationIndex() method to determine 
+     *  what the index to navigate to based on the item that 
+     *  is currently in focus. Once the index is determined, 
+     *  single selection, caret item and if necessary, multiple 
+     *  selections are updated to reflect the newly selected
+     *  item.  
+     *
+     *  @param event The Keyboard Event encountered
+     * 
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    /* protected function 
adjustSelectionAndCaretUponNavigation(event:KeyboardEvent):void
+    {
+        // If rtl layout, need to swap Keyboard.LEFT and Keyboard.RIGHT.
+        var navigationUnit:uint = mapKeycodeForLayoutDirection(event);
+        
+        // Some unrecognized key stroke was entered, return. 
+        if (!NavigationUnit.isNavigationUnit(event.keyCode))
+            return; 
+           
+        // Delegate to the layout to tell us what the next item is we should 
select or focus into.
+        // TODO (dsubrama): At some point we should refactor this so we don't 
depend on layout
+        // for keyboard handling. If layout doesn't exist, then use some other 
keyboard handler
+        var proposedNewIndex:int = 
layout.getNavigationDestinationIndex(caretIndex, navigationUnit, 
arrowKeysWrapFocus); 
+        
+        // Note that the KeyboardEvent is canceled even if the current 
selected or in focus index
+        // doesn't change because we don't want another component to start 
handling these
+        // events when the index reaches a limit.
+        if (proposedNewIndex == -1)
+            return;
+            
+        event.preventDefault(); 
+        
+        // Contiguous multi-selection action. Create the new selection
+        // interval.   
+        if (allowMultipleSelection && event.shiftKey && selectedIndices)
+        {
+            var startIndex:Number = getLastSelectedIndex(); 
+            var newInterval:Vector.<int> = new Vector.<int>();  
+            var i:int; 
+            if (startIndex <= proposedNewIndex)
+            {
+                for (i = startIndex; i <= proposedNewIndex; i++)
+                {
+                    newInterval.splice(0, 0, i); 
+                }
+            }
+            else 
+            {
+                for (i = startIndex; i >= proposedNewIndex; i--)
+                {
+                    newInterval.splice(0, 0, i); 
+                }
+            }
+            setSelectedIndices(newInterval, true);  
+            ensureIndexIsVisible(proposedNewIndex); 
+        }
+        // Entering the caret state with the Ctrl key down 
+        // TODO (rfrishbe): shouldn't just check interactionMode but should 
depend on 
+        // either the platform or whether it was a 5-way button or whether 
+        // soem other keyboardSelection style.
+        else if (event.ctrlKey || getStyle("interactionMode") == 
InteractionMode.TOUCH)
+        {
+            var oldCaretIndex:Number = caretIndex; 
+            setCurrentCaretIndex(proposedNewIndex);
+            var e:IndexChangeEvent = new 
IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
+            e.oldIndex = oldCaretIndex; 
+            e.newIndex = caretIndex; 
+            dispatchEvent(e);
+            ensureIndexIsVisible(proposedNewIndex); 
+        }
+        // Its just a new selection action, select the new index.
+        else
+        {
+            setSelectedIndex(proposedNewIndex, true);
+            ensureIndexIsVisible(proposedNewIndex);
+        }
+    } */
+    
+    /**
+     *  @private
+     *  Helper used to determine if the target of a KeyboardEvent happens to 
+     *  be an editable text instance.
+     */
+    /* protected function isEditableTarget(target:Object):Boolean
+    {
+        var focusObj:Object = getFocus();
+        return ((focusObj is TextField && focusObj.type=="input") ||
+            (richEditableTextClass && focusObj is richEditableTextClass &&
+             focusObj.editable == true))
+    } */
+}
+
+}

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to