Updates to DataGrid, incorporating ArrayList as its default type of data 
provider. Adding DataProviderChangeNotifier to facilitate picking up changes in 
the data model and reflecting them in the DataGrid.


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

Branch: refs/heads/master
Commit: c472807d21102a398ccb7aed12dcd9d9e0287d57
Parents: cc526bd
Author: Peter Ent <[email protected]>
Authored: Wed Oct 7 15:56:58 2015 -0400
Committer: Peter Ent <[email protected]>
Committed: Wed Oct 7 15:56:58 2015 -0400

----------------------------------------------------------------------
 frameworks/projects/HTML/as/defaults.css        |  19 +-
 .../projects/HTML/asjs/src/HTMLASJSClasses.as   |   3 +
 .../asjs/src/org/apache/flex/html/DataGrid.as   |  20 ++
 .../org/apache/flex/html/beads/DataGridView.as  |  38 ++-
 .../DataItemRendererFactoryForArrayList.as      | 171 +++++++++++++
 .../html/beads/DataProviderChangeNotifier.as    | 154 ++++++++++++
 .../beads/models/ArrayListSelectionModel.as     | 242 +++++++++++++++++++
 .../flex/html/beads/models/DataGridModel.as     |   7 +-
 frameworks/projects/HTML/basic-manifest.xml     |   1 +
 .../projects/HTML/compile-asjs-config.xml       |   1 +
 frameworks/projects/HTML/compile-config.xml     |   1 +
 .../ListSingleSelectionMouseController.js       |   4 +-
 12 files changed, 631 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/as/defaults.css
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/as/defaults.css 
b/frameworks/projects/HTML/as/defaults.css
index f3c15b9..1a61438 100644
--- a/frameworks/projects/HTML/as/defaults.css
+++ b/frameworks/projects/HTML/as/defaults.css
@@ -113,8 +113,25 @@ DataGrid
        border-width: 1px;
 }
 
+.DataGridColumn {
+       IBeadModel: 
ClassReference("org.apache.flex.html.beads.models.DataGridModel");
+       IBeadView:  ClassReference("org.apache.flex.html.beads.ListView");      
                
+       IBeadController: 
ClassReference("org.apache.flex.html.beads.controllers.ListSingleSelectionMouseController");
+       IBeadLayout: 
ClassReference("org.apache.flex.html.beads.layouts.VerticalLayout");
+       IContentView: 
ClassReference("org.apache.flex.html.supportClasses.DataGroup");
+       IDataProviderItemRendererMapper: 
ClassReference("org.apache.flex.html.beads.DataItemRendererFactoryForArrayList");
+       IItemRendererClassFactory: 
ClassReference("org.apache.flex.core.ItemRendererClassFactory");
+       IItemRenderer: 
ClassReference("org.apache.flex.html.supportClasses.StringItemRenderer");
+       IViewport: 
ClassReference("org.apache.flex.html.supportClasses.Viewport");
+       IViewportModel: 
ClassReference("org.apache.flex.html.beads.models.ViewportModel");
+       border-style: none;
+       background-color: #FFFFFF;
+}
+
 .DataGridListArea {
-       background-color: #999999;
+       background-color: #AAAAAA;
+       border-style: solid;
+       border-color: #333333;
 }
 
 DateChooser {

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/HTMLASJSClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/asjs/src/HTMLASJSClasses.as 
b/frameworks/projects/HTML/asjs/src/HTMLASJSClasses.as
index 73547db..99a837b 100644
--- a/frameworks/projects/HTML/asjs/src/HTMLASJSClasses.as
+++ b/frameworks/projects/HTML/asjs/src/HTMLASJSClasses.as
@@ -29,9 +29,12 @@ internal class HTMLASJSClasses
 {
        import org.apache.flex.html.beads.DataGridColumnView; 
DataGridColumnView;
        import org.apache.flex.html.beads.DataGridView; DataGridView;
+       import org.apache.flex.html.beads.DataProviderChangeNotifier; 
DataProviderChangeNotifier;
+       import org.apache.flex.html.beads.DataItemRendererFactoryForArrayList; 
DataItemRendererFactoryForArrayList;
        import org.apache.flex.html.beads.DateChooserView; DateChooserView;
        import org.apache.flex.html.beads.DateFieldView; DateFieldView;
     import 
org.apache.flex.html.beads.layouts.FlexibleFirstChildHorizontalLayout; 
FlexibleFirstChildHorizontalLayout;
+       import org.apache.flex.html.beads.models.ArrayListSelectionModel; 
ArrayListSelectionModel;
        import org.apache.flex.html.beads.models.DataGridModel; DataGridModel;
        import org.apache.flex.html.beads.models.DateChooserModel; 
DateChooserModel;
        import org.apache.flex.html.beads.models.DataGridPresentationModel; 
DataGridPresentationModel;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/org/apache/flex/html/DataGrid.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/DataGrid.as 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/DataGrid.as
index 4aa38d2..8cba078 100644
--- a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/DataGrid.as
+++ b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/DataGrid.as
@@ -140,5 +140,25 @@ package org.apache.flex.html
                {
                        presentationModel.rowHeight = value;
                }
+               
+               /**
+                * @private
+                * The DataGrid needs to know whenever its size is being 
changed so the columns can be
+                * be aligned properly, so the noEvent value must always be 
false.
+                */
+               override public function setWidth(value:Number, 
noEvent:Boolean=false):void
+               {
+                       super.setWidth(value,false);
+               }
+               
+               /**
+                * @private
+                * The DataGrid needs to know whenever its size is being 
changed so the columns can be
+                * be aligned properly, so the noEvent value must always be 
false.
+                */
+               override public function setHeight(value:Number, 
noEvent:Boolean=false):void
+               {
+                       super.setHeight(value,false);
+               }
        }
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataGridView.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataGridView.as 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataGridView.as
index 150294c..43c410f 100644
--- 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataGridView.as
+++ 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataGridView.as
@@ -18,6 +18,7 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.flex.html.beads
 {      
+       import org.apache.flex.core.IBead;
        import org.apache.flex.core.IBeadModel;
        import org.apache.flex.core.IBeadView;
        import org.apache.flex.core.IDataGridModel;
@@ -25,8 +26,8 @@ package org.apache.flex.html.beads
        import org.apache.flex.core.ISelectionModel;
        import org.apache.flex.core.IStrand;
        import org.apache.flex.core.IUIBase;
-       import org.apache.flex.core.SimpleCSSStyles;
        import org.apache.flex.core.UIBase;
+       import org.apache.flex.core.ValuesManager;
        import org.apache.flex.events.Event;
        import org.apache.flex.events.IEventDispatcher;
        import org.apache.flex.html.ButtonBar;
@@ -90,6 +91,8 @@ package org.apache.flex.html.beads
                        _strand = value;
                        
                        var host:UIBase = value as UIBase;
+                       host.addEventListener("widthChanged", 
handleSizeChanges);
+                       host.addEventListener("heightChanged", 
handleSizeChanges);
                        
                        _header = new ButtonBar();
                        _header.id = "dataGridHeader";
@@ -102,13 +105,6 @@ package org.apache.flex.html.beads
                        _listArea.className = "DataGridListArea";
                        _listArea.addBead(scrollPort);
                        
-                       // place a border around the list area
-                       var style:SimpleCSSStyles = new SimpleCSSStyles();
-                       style.borderWidth = 1;
-                       style.borderColor = 0x333333;
-                       style.borderStyle = "solid";
-                       _listArea.style = style;
-                       
                        finishSetup(null);
                }
                
@@ -180,13 +176,21 @@ package org.apache.flex.html.beads
                        _listArea.width = host.width;
                        _listArea.height = host.height - _header.height;
                        
-                       if (_lists != null) {
+                       var sharedModel:IDataGridModel = 
_strand.getBeadByType(IBeadModel) as IDataGridModel;
+                       
+                       if (_lists != null && _lists.length > 0) {
                                var xpos:Number = 0;
+                               var listWidth:Number = host.width / 
_lists.length;
                                for (var i:int=0; i < _lists.length; i++) {
                                        var list:List = _lists[i] as List;
                                        list.x = xpos;
                                        list.y = 0;
                                        
+                                       var dataGridColumn:DataGridColumn = 
sharedModel.columns[i] as DataGridColumn;
+                                       var colWidth:Number = 
dataGridColumn.columnWidth;
+                                       if (!isNaN(colWidth)) list.width = 
colWidth - 1;
+                                       else list.width = listWidth - 1;
+                                       
                                        xpos += list.width + 1;
                                }
                        }
@@ -274,19 +278,13 @@ package org.apache.flex.html.beads
                        
                        _lists = new Array();
                        
-                       for (var i:int=0; i < sharedModel.columns.length; i++) {
-                               
-                               var listModel:ISelectionModel = new 
ArraySelectionModel();
-                               listModel.dataProvider = 
sharedModel.dataProvider;
-                               
+                       for (var i:int=0; i < sharedModel.columns.length; i++) 
{                                
                                var dataGridColumn:DataGridColumn = 
sharedModel.columns[i] as DataGridColumn;
                                
                                var list:List = new List();
                                list.id = "dataGridColumn"+String(i);
                                list.className = "DataGridColumn";
-                               list.addBead(listModel); 
-                               list.addBead(new Viewport()); // do not want 
lists to scroll independently
-                               list.addBead(new VerticalLayout());
+                               list.addBead(sharedModel); 
                                list.itemRenderer = dataGridColumn.itemRenderer;
                                list.labelField = dataGridColumn.dataField;
                                
list.addEventListener('change',handleColumnListChange);
@@ -294,12 +292,6 @@ package org.apache.flex.html.beads
                                
list.addEventListener('rollout',handleColumnListRollOut);
                                list.addBead(presentationModel);
                                
-                               // do not want lists to have their own sizes
-                               var style:SimpleCSSStyles = new 
SimpleCSSStyles();
-                               style.borderWidth = 0;
-                               style.backgroundColor = 0xFFFFFF;
-                               list.style = style;
-                               
                                var colWidth:Number = 
dataGridColumn.columnWidth;
                                if (!isNaN(colWidth)) list.width = colWidth - 1;
                                else list.width = listWidth - 1;

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataItemRendererFactoryForArrayList.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataItemRendererFactoryForArrayList.as
 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataItemRendererFactoryForArrayList.as
new file mode 100644
index 0000000..f2c4ae7
--- /dev/null
+++ 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataItemRendererFactoryForArrayList.as
@@ -0,0 +1,171 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 org.apache.flex.html.beads
+{
+       import org.apache.flex.collections.ArrayList;
+       import org.apache.flex.core.IBead;
+       import org.apache.flex.core.IDataProviderItemRendererMapper;
+       import org.apache.flex.core.IItemRendererClassFactory;
+       import org.apache.flex.core.IItemRendererParent;
+       import org.apache.flex.core.IListPresentationModel;
+       import org.apache.flex.core.ISelectableItemRenderer;
+       import org.apache.flex.core.ISelectionModel;
+       import org.apache.flex.core.IStrand;
+       import org.apache.flex.core.IUIBase;
+       import org.apache.flex.core.SimpleCSSStyles;
+       import org.apache.flex.core.UIBase;
+       import org.apache.flex.core.ValuesManager;
+       import org.apache.flex.events.Event;
+       import org.apache.flex.events.IEventDispatcher;
+       import org.apache.flex.html.List;
+       
+    /**
+     *  The DataItemRendererFactoryForArrayList class uses an ArrayList
+        *  and creates an item renderer for every
+     *  item in the collection.  Other implementations of
+     *  IDataProviderItemRendererMapper map different data 
+     *  structures or manage a virtual set of renderers.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion FlexJS 0.0
+     */
+       public class DataItemRendererFactoryForArrayList implements IBead, 
IDataProviderItemRendererMapper
+       {
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function DataItemRendererFactoryForArrayList()
+               {
+               }
+               
+               private var selectionModel:ISelectionModel;
+               
+               private var labelField:String;
+               
+               private var _strand:IStrand;
+               
+        /**
+         *  @copy org.apache.flex.core.IBead#strand
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+                       
IEventDispatcher(_strand).addEventListener("beadsAdded", finishSetup);
+                       
IEventDispatcher(_strand).addEventListener("initComplete", finishSetup);
+               }
+               
+               private function finishSetup(event:Event):void
+               {
+                       selectionModel = _strand.getBeadByType(ISelectionModel) 
as ISelectionModel;
+                       var listView:IListView = 
_strand.getBeadByType(IListView) as IListView;
+                       dataGroup = listView.dataGroup;
+                       selectionModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);
+                       
+                       labelField = (listView.host as List).labelField;
+                       
+                       if (!itemRendererFactory)
+                       {
+                               _itemRendererFactory = 
_strand.getBeadByType(IItemRendererClassFactory) as IItemRendererClassFactory;
+                               if (_itemRendererFactory == null) {
+                                       _itemRendererFactory = new 
(ValuesManager.valuesImpl.getValue(_strand, "iItemRendererClassFactory")) as 
IItemRendererClassFactory;
+                                       _strand.addBead(_itemRendererFactory);
+                               }
+                       }
+                       
+                       dataProviderChangeHandler(null);
+               }
+               
+               private var _itemRendererFactory:IItemRendererClassFactory;
+               
+        /**
+         *  The org.apache.flex.core.IItemRendererClassFactory used 
+         *  to generate instances of item renderers.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get 
itemRendererFactory():IItemRendererClassFactory
+               {
+                       return _itemRendererFactory;
+               }
+               
+        /**
+         *  @private
+         */
+               public function set 
itemRendererFactory(value:IItemRendererClassFactory):void
+               {
+                       _itemRendererFactory = value;
+               }
+               
+        /**
+         *  The org.apache.flex.core.IItemRendererParent that will
+         *  parent the item renderers.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               protected var dataGroup:IItemRendererParent;
+               
+               private function dataProviderChangeHandler(event:Event):void
+               {
+                       var dp:ArrayList = selectionModel.dataProvider as 
ArrayList;
+                       if (!dp)
+                               return;
+                       
+                       dataGroup.removeAllElements();
+                       
+                       var listView:IListView = 
_strand.getBeadByType(IListView) as IListView;
+                       var presentationModel:IListPresentationModel = 
_strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+                       
+                       var n:int = dp.length; 
+                       for (var i:int = 0; i < n; i++)
+                       {                               
+                               var ir:ISelectableItemRenderer = 
itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+                               ir.index = i;
+                               ir.labelField = labelField;
+                               if (presentationModel) {
+                                       var style:SimpleCSSStyles = new 
SimpleCSSStyles();
+                                       style.marginBottom = 
presentationModel.separatorThickness;
+                                       UIBase(ir).style = style;
+                                       UIBase(ir).height = 
presentationModel.rowHeight;
+                               }
+                               dataGroup.addElement(ir);
+                               ir.data = dp.getItemAt(i);
+                       }
+                       
+                       IEventDispatcher(_strand).dispatchEvent(new 
Event("itemsCreated"));
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataProviderChangeNotifier.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataProviderChangeNotifier.as
 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataProviderChangeNotifier.as
new file mode 100644
index 0000000..8905fb9
--- /dev/null
+++ 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/DataProviderChangeNotifier.as
@@ -0,0 +1,154 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 org.apache.flex.html.beads
+{
+       import org.apache.flex.core.IBead;
+       import org.apache.flex.core.IDocument;
+       import org.apache.flex.core.ISelectionModel;
+       import org.apache.flex.core.IStrand;
+       import org.apache.flex.events.Event;
+       import org.apache.flex.collections.ArrayList;
+       
+       /**
+        *  The DataProviderChangeNotifier notifies listeners when a selection 
model's
+        *  ArrayList dataProvider has changed.
+        *  
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion FlexJS 0.0
+        */
+       public class DataProviderChangeNotifier implements IBead, IDocument
+       {
+               /**
+                *  constructor.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion FlexJS 0.0
+                */
+               public function DataProviderChangeNotifier()
+               {
+               }
+               
+               protected var _dataProvider:ArrayList;
+               
+               private var _strand:IStrand;
+               
+               /**
+                *  @copy org.apache.flex.core.IBead#strand
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion FlexJS 0.0
+                */
+               public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+                       
+                       if (_dataProvider == null) {
+                               var object:Object = document[sourceID];
+                               _dataProvider = object[propertyName] as 
ArrayList;
+                       }
+                       
+                       _dataProvider.addEventListener("itemAdded", 
handleItemAdded);
+                       _dataProvider.addEventListener("itemRemoved", 
handleItemRemoved);
+                       _dataProvider.addEventListener("itemUpdated", 
handleItemUpdated);
+
+               }
+               
+               protected var document:Object;
+               
+               /**
+                * @private
+                */
+               public function setDocument(document:Object, id:String = 
null):void
+               {
+                       this.document = document;
+               }
+               
+               private var _sourceID:String;
+               
+               /**
+                *  The ID of the object holding the ArrayList, usually a model.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion FlexJS 0.0
+                */
+               public function get sourceID():String
+               {
+                       return _sourceID;
+               }
+               public function set sourceID(value:String):void
+               {
+                       _sourceID = value;
+               }
+               
+               private var _propertyName:String;
+               
+               /**
+                *  The property in the sourceID that is the ArrayList.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion FlexJS 0.0
+                */
+               public function get propertyName():String
+               {
+                       return _propertyName;
+               }
+               
+               public function set propertyName(value:String):void
+               {
+                       _propertyName = value;
+               }
+               
+               /**
+                * @private
+                */
+               private function handleItemAdded(event:Event):void
+               {
+                       var selectionModel:ISelectionModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
+                       selectionModel.dispatchEvent(new 
Event("dataProviderChanged"));
+               }
+               
+               /**
+                * @private
+                */
+               private function handleItemRemoved(event:Event):void
+               {
+                       var selectionModel:ISelectionModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
+                       selectionModel.dispatchEvent(new 
Event("dataProviderChanged"));
+               }
+               
+               /**
+                * @private
+                */
+               private function handleItemUpdated(event:Event):void
+               {
+                       var selectionModel:ISelectionModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
+                       selectionModel.dispatchEvent(new 
Event("dataProviderChanged"));
+               }
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/ArrayListSelectionModel.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/ArrayListSelectionModel.as
 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/ArrayListSelectionModel.as
new file mode 100644
index 0000000..920e967
--- /dev/null
+++ 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/ArrayListSelectionModel.as
@@ -0,0 +1,242 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 org.apache.flex.html.beads.models
+{
+       import org.apache.flex.collections.ArrayList;
+       import org.apache.flex.core.IRollOverModel;
+       import org.apache.flex.core.ISelectionModel;
+       import org.apache.flex.core.IStrand;
+       import org.apache.flex.events.Event;
+       import org.apache.flex.events.EventDispatcher;
+                       
+    /**
+     *  The ArrayListSelectionModel class is a selection model for
+     *  a dataProvider that is an ArrayList. It assumes that items
+     *  can be fetched from the dataProvider using 
dataProvider.getItemAt(index).
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion FlexJS 0.0
+     */
+       public class ArrayListSelectionModel extends EventDispatcher implements 
ISelectionModel, IRollOverModel
+       {
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function ArrayListSelectionModel()
+               {
+               }
+
+               private var _strand:IStrand;
+               
+        /**
+         *  @copy org.apache.flex.core.IBead#strand
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+               }
+               
+               private var _dataProvider:ArrayList;
+        
+        /**
+         *  @copy org.apache.flex.core.ISelectionModel#dataProvider
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get dataProvider():Object
+               {
+                       return _dataProvider;
+               }
+
+        /**
+         *  @private
+         */
+               public function set dataProvider(value:Object):void
+               {
+            if (value === _dataProvider) return;
+            
+            _dataProvider = value as ArrayList;
+            if (_selectedIndex != -1)
+                _selectedItem = (_dataProvider == null || _selectedIndex >= 
_dataProvider.length) ? null : 
+                    _dataProvider.getItemAt(_selectedIndex);
+                       dispatchEvent(new Event("dataProviderChanged"));
+               }
+
+               private var _selectedIndex:int = -1;
+               private var _rollOverIndex:int = -1;
+               private var _labelField:String = null;
+               
+        /**
+         *  @copy org.apache.flex.core.ISelectionModel#labelField
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get labelField():String
+               {
+                       return _labelField;
+               }
+
+        /**
+         *  @private
+         */
+               public function set labelField(value:String):void
+               {
+                       if (value != _labelField) {
+                               _labelField = value;
+                               dispatchEvent(new Event("labelFieldChanged"));
+                       }
+               }
+               
+        /**
+         *  @copy org.apache.flex.core.ISelectionModel#selectedIndex
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get selectedIndex():int
+               {
+                       return _selectedIndex;
+               }
+
+        /**
+         *  @private
+         */
+               public function set selectedIndex(value:int):void
+               {
+            if (value === _selectedIndex) return;
+            
+                       _selectedIndex = value;
+                       _selectedItem = (value == -1 || _dataProvider == null) 
? null : (value < _dataProvider.length) ? _dataProvider.getItemAt(value) : null;
+                       dispatchEvent(new Event("selectedIndexChanged"));       
                
+               }
+               
+        /**
+         *  @copy org.apache.flex.core.IRollOverModel#rollOverIndex
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get rollOverIndex():int
+               {
+                       return _rollOverIndex;
+               }
+
+        /**
+         *  @private
+         */
+               public function set rollOverIndex(value:int):void
+               {
+                       _rollOverIndex = value;
+                       dispatchEvent(new Event("rollOverIndexChanged"));       
                
+               }
+               
+               private var _selectedItem:Object;
+               
+        /**
+         *  @copy org.apache.flex.core.ISelectionModel#selectedItem
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get selectedItem():Object
+               {
+                       return _selectedItem;
+               }
+
+        /**
+         *  @private
+         */
+               public function set selectedItem(value:Object):void
+               {
+            if (value === _selectedItem) return;
+            
+                       _selectedItem = value;  
+                       var n:int = _dataProvider.length;
+                       for (var i:int = 0; i < n; i++)
+                       {
+                               if (_dataProvider.getItemAt(i) == value)
+                               {
+                                       _selectedIndex = i;
+                                       break;
+                               }
+                       }
+                       dispatchEvent(new Event("selectedItemChanged"));        
                
+                       dispatchEvent(new Event("selectedIndexChanged"));
+               }
+               
+               private var _selectedString:String;
+               
+        /**
+         *  An alternative to selectedItem for strongly typing the
+         *  the selectedItem if the Array is an Array of Strings.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+               public function get selectedString():String
+               {
+                       return String(_selectedItem);
+               }
+
+        /**
+         *  @private
+         */
+               public function set selectedString(value:String):void
+               {
+                       _selectedString = value;
+                       var n:int = _dataProvider.length;
+                       for (var i:int = 0; i < n; i++)
+                       {
+                               if (String(_dataProvider.getItemAt(i)) == value)
+                               {
+                                       _selectedIndex = i;
+                                       break;
+                               }
+                       }
+                       dispatchEvent(new Event("selectedItemChanged"));        
                
+                       dispatchEvent(new Event("selectedIndexChanged"));       
                
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/DataGridModel.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/DataGridModel.as
 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/DataGridModel.as
index f50b36a..531edac 100644
--- 
a/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/DataGridModel.as
+++ 
b/frameworks/projects/HTML/asjs/src/org/apache/flex/html/beads/models/DataGridModel.as
@@ -22,16 +22,15 @@ package org.apache.flex.html.beads.models
        import org.apache.flex.events.Event;
        
        /**
-        *  The DataGridModel class bead extends 
org.apache.flex.html.beads.modelsArraySelectionModel 
-        *  and adds the array of 
org.apache.flex.html.supportClasses.DataGridColumns used to define 
-        *  each of the column in the DataGrid.
+        *  The DataGridModel class bead extends 
org.apache.flex.html.beads.models.ArrayListSelectionModel 
+        *  to facilitate using an ArrayList as the dataProvider for the 
DataGrid.
         *  
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
         *  @productversion FlexJS 0.0
         */
-       public class DataGridModel extends ArraySelectionModel implements 
IDataGridModel
+       public class DataGridModel extends ArrayListSelectionModel implements 
IDataGridModel
        {
                /**
                 *  constructor.

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/basic-manifest.xml
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/basic-manifest.xml 
b/frameworks/projects/HTML/basic-manifest.xml
index 71a4049..921c67b 100644
--- a/frameworks/projects/HTML/basic-manifest.xml
+++ b/frameworks/projects/HTML/basic-manifest.xml
@@ -80,6 +80,7 @@
     <component id="ScrollingViewport" 
class="org.apache.flex.html.supportClasses.ScrollingViewport" />
 
     <component id="DataGrid" class="org.apache.flex.html.DataGrid"/>
+    <component id="DataProviderChangeNotifier" 
class="org.apache.flex.html.beads.DataProviderChangeNotifier"/>
     <component id="DataGridColumn" 
class="org.apache.flex.html.supportClasses.DataGridColumn"/>
 
     <component id="DateChooser" class="org.apache.flex.html.DateChooser"/>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/compile-asjs-config.xml
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/compile-asjs-config.xml 
b/frameworks/projects/HTML/compile-asjs-config.xml
index c0379f3..eec0d6d 100644
--- a/frameworks/projects/HTML/compile-asjs-config.xml
+++ b/frameworks/projects/HTML/compile-asjs-config.xml
@@ -49,6 +49,7 @@
             <path-element>../../libs/Binding.swc</path-element>
             <path-element>../../libs/Core.swc</path-element>
             <path-element>../../libs/Graphics.swc</path-element>
+            <path-element>../../libs/Collections.swc</path-element>
             <path-element>../../libs/HTML.swc</path-element>
         </library-path>
         

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/compile-config.xml
----------------------------------------------------------------------
diff --git a/frameworks/projects/HTML/compile-config.xml 
b/frameworks/projects/HTML/compile-config.xml
index 8d7bfd5..cceec8a 100644
--- a/frameworks/projects/HTML/compile-config.xml
+++ b/frameworks/projects/HTML/compile-config.xml
@@ -26,6 +26,7 @@
             <path-element>../../libs/Binding.swc</path-element>
             <path-element>../../libs/Core.swc</path-element>
             <path-element>../../libs/Graphics.swc</path-element>
+            <path-element>../../libs/Collections.swc</path-element>
         </external-library-path>
         
                <mxml>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c472807d/frameworks/projects/HTML/js/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.js
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/HTML/js/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.js
 
b/frameworks/projects/HTML/js/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.js
index aca36cc..282e8fd 100644
--- 
a/frameworks/projects/HTML/js/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.js
+++ 
b/frameworks/projects/HTML/js/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.js
@@ -16,8 +16,8 @@ 
goog.provide('org.apache.flex.html.beads.controllers.ListSingleSelectionMouseCon
 
 goog.require('org.apache.flex.core.IBeadController');
 goog.require('org.apache.flex.core.ISelectableItemRenderer');
+goog.require('org.apache.flex.core.ISelectionModel');
 goog.require('org.apache.flex.html.beads.ListView');
-goog.require('org.apache.flex.html.beads.models.ArraySelectionModel');
 goog.require('org.apache.flex.utils.Language');
 
 
@@ -49,7 +49,7 @@ 
Object.defineProperties(org.apache.flex.html.beads.controllers.ListSingleSelecti
             this.strand_ = value;
 
             this.model = value.getBeadByType(
-                org.apache.flex.html.beads.models.ArraySelectionModel);
+                org.apache.flex.core.ISelectionModel);
             this.listView = value.getBeadByType(
                 org.apache.flex.html.beads.ListView);
 

Reply via email to