Merge branch 'develop' into CollectionData
* develop: (29 commits)
more fixes to script
try to fix spaces in path issue
[maven-release-plugin] prepare for next development iteration
[maven-release-plugin] prepare branch release/0.9.0
This should fix it
Revert "[maven-release-plugin] prepare branch release/0.9.0"
Revert "[maven-release-plugin] prepare for next development iteration"
[maven-release-plugin] prepare for next development iteration
[maven-release-plugin] prepare branch release/0.9.0
Revert "[maven-release-plugin] prepare branch release/0.9.0"
Revert "[maven-release-plugin] prepare for next development iteration"
more fixes for rc script
[maven-release-plugin] prepare for next development iteration
[maven-release-plugin] prepare branch release/0.9.0
more debugging
Revert "[maven-release-plugin] prepare branch release/0.9.0"
Revert "[maven-release-plugin] prepare for next development iteration"
Revert "[maven-release-plugin] prepare branch release/0.9.0"
Revert "[maven-release-plugin] prepare for next development iteration"
[maven-release-plugin] prepare for next development iteration
...
diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index 0a57697..3ce4773 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -157,6 +157,7 @@
<component id="DynamicRemoveItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveItemRendererForArrayListData" />
<component id="DynamicUpdateItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicUpdateItemRendererForArrayListData"/>
<component id="DataItemRendererFactoryForHierarchicalData" class="org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData" />
+ <component id="DataItemRendererFactoryForCollectionView" class="org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView" />
<component id="DynamicRemoveAllItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveAllItemRendererForArrayListData" />
<component id="DynamicRemoveAllByNullItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveAllByNullItemRendererForArrayListData" />
<component id="TextItemRendererFactoryForArrayData" class="org.apache.royale.html.beads.TextItemRendererFactoryForArrayData" />
diff --git a/frameworks/projects/Basic/src/main/resources/defaults.css b/frameworks/projects/Basic/src/main/resources/defaults.css
index b83dc37..bf15027 100644
--- a/frameworks/projects/Basic/src/main/resources/defaults.css
+++ b/frameworks/projects/Basic/src/main/resources/defaults.css
@@ -194,7 +194,7 @@
IBeadView: ClassReference("org.apache.royale.html.beads.ListView");
IBeadController: ClassReference("org.apache.royale.html.beads.controllers.ListSingleSelectionMouseController");
IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
- IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForArrayList");
+ IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView");
IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
IItemRenderer: ClassReference("org.apache.royale.html.supportClasses.StringItemRenderer");
IViewport: ClassReference("org.apache.royale.html.supportClasses.Viewport");
@@ -403,7 +403,7 @@
Tree
{
- IBeadModel: ClassReference("org.apache.royale.html.beads.models.ArrayListSelectionModel");
+ IBeadModel: ClassReference("org.apache.royale.html.beads.models.TreeModel");
IBeadView: ClassReference("org.apache.royale.html.beads.ListView");
IBeadController: ClassReference("org.apache.royale.html.beads.controllers.TreeSingleSelectionMouseController");
IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
@@ -419,9 +419,11 @@
TreeGrid
{
IBeadModel: ClassReference("org.apache.royale.html.beads.models.TreeGridModel");
+}
+/*
IBeadView: ClassReference("org.apache.royale.html.beads.TreeGridView");
IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.TreeGridLayout");
-}
+ */
.TreeGridContentArea .List {
display: inline-block;
diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index 6ba89fc..5777a46 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -104,6 +104,8 @@
import org.apache.royale.html.beads.models.AlertModel; AlertModel;
import org.apache.royale.html.beads.models.ArraySelectionModel; ArraySelectionModel;
import org.apache.royale.html.beads.models.ArrayListSelectionModel; ArrayListSelectionModel;
+ import org.apache.royale.html.beads.models.SingleSelectionCollectionViewModel; SingleSelectionCollectionViewModel;
+ import org.apache.royale.html.beads.models.TreeModel; TreeModel;
import org.apache.royale.html.beads.models.RangeModel; RangeModel;
import org.apache.royale.html.beads.models.RangeModelExtended; RangeModelExtended;
import org.apache.royale.html.beads.models.ComboBoxModel; ComboBoxModel;
@@ -168,6 +170,7 @@
import org.apache.royale.html.beads.DynamicItemsRendererFactoryForArrayListData; DynamicItemsRendererFactoryForArrayListData;
import org.apache.royale.html.beads.DataItemRendererFactoryForArrayList; DataItemRendererFactoryForArrayList;
import org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData; DataItemRendererFactoryForHierarchicalData;
+ import org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView; DataItemRendererFactoryForCollectionView;
import org.apache.royale.html.supportClasses.DataGroup; DataGroup;
import org.apache.royale.html.supportClasses.Viewport; Viewport;
import org.apache.royale.html.supportClasses.ScrollingViewport; ScrollingViewport;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as
index 6fe6954..43b1c29 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as
@@ -18,8 +18,10 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.royale.html
{
- import org.apache.royale.collections.FlattenedList;
+// import org.apache.royale.collections.FlattenedList;
import org.apache.royale.collections.HierarchicalData;
+ import org.apache.royale.collections.TreeData;
+ import org.apache.royale.html.beads.models.TreeModel;
/**
* The Tree component displays structured data. The Tree uses a HierarchicalData
@@ -44,30 +46,21 @@
{
super();
}
-
- private var _hierarchicalData:HierarchicalData;
- private var _flatList:FlattenedList;
-
+
/**
- * The dataProvider should be of type HierarchicalData.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion Royale 0.0
- * @see org.apache.royale.collections.HierarchicalData.
+ * The dataProvider for a Tree is TreeData which is created
+ * from HierarchicalData. You can set the dataProvider with
+ * TreeData or HierarchicalData and it will create a TreeData
+ * from that.
*/
- override public function get dataProvider():Object
- {
- return _hierarchicalData;
- }
override public function set dataProvider(value:Object):void
{
- _hierarchicalData = value as HierarchicalData;
-
- _flatList = new FlattenedList(_hierarchicalData);
-
- super.dataProvider = _flatList;
+ if (value is HierarchicalData) {
+ var treeData:TreeData = new TreeData(value as HierarchicalData);
+ super.dataProvider = treeData;
+ } else {
+ super.dataProvider = value;
+ }
}
}
}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as
index eb02629..57cd35d 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as
@@ -18,8 +18,11 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.royale.html
{
+ import org.apache.royale.collections.HierarchicalData;
+ import org.apache.royale.collections.TreeData;
import org.apache.royale.core.UIBase;
import org.apache.royale.html.beads.models.TreeGridModel;
+ import org.apache.royale.html.beads.models.TreeModel;
/**
* A TreeGrid is a combination of a Tree and a DataGrid. The first column of the
@@ -33,7 +36,7 @@
* @playerversion AIR 2.6
* @productversion Royale 0.9
*/
- public class TreeGrid extends UIBase
+ public class TreeGrid extends DataGrid
{
/**
* Constructor.
@@ -48,22 +51,21 @@
super();
}
+
/**
- * The dataProvider should be of type HierarchicalData.
- *
- * @langversion 3.0
- * @playerversion Flash 10.2
- * @playerversion AIR 2.6
- * @productversion Royale 0.9
- * @see org.apache.royale.collections.HierarchicalData.
+ * The dataProvider for a TreeGrid is TreeData which is created
+ * from HierarchicalData. You can set the dataProvider with
+ * TreeData or HierarchicalData and it will create a TreeData
+ * from that.
*/
- public function get dataProvider():Object
+ override public function set dataProvider(value:Object):void
{
- return (model as TreeGridModel).dataProvider;
- }
- public function set dataProvider(value:Object):void
- {
- (model as TreeGridModel).dataProvider = value;
+ if (value is HierarchicalData) {
+ var treeData:TreeData = new TreeData(value as HierarchicalData);
+ super.dataProvider = treeData;
+ } else {
+ super.dataProvider = value;
+ }
}
/**
@@ -74,13 +76,13 @@
* @playerversion AIR 2.6
* @productversion Royale 0.9
*/
- public function get columns():Array
- {
- return (model as TreeGridModel).columns;
- }
- public function set columns(value:Array):void
- {
- (model as TreeGridModel).columns = value;
- }
+// public function get columns():Array
+// {
+// return (model as TreeGridModel).columns;
+// }
+// public function set columns(value:Array):void
+// {
+// (model as TreeGridModel).columns = value;
+// }
}
}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
index 587d9a5..f3f2b82 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
@@ -18,19 +18,22 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.royale.html.beads
{
+ import org.apache.royale.core.ClassFactory;
import org.apache.royale.core.IBeadModel;
import org.apache.royale.core.IBeadView;
import org.apache.royale.core.IDataGridModel;
import org.apache.royale.core.IDataGridPresentationModel;
+ import org.apache.royale.core.IFactory;
import org.apache.royale.core.ISelectionModel;
import org.apache.royale.core.IStrand;
import org.apache.royale.core.IUIBase;
import org.apache.royale.core.ValuesManager;
import org.apache.royale.events.Event;
import org.apache.royale.events.IEventDispatcher;
+ import org.apache.royale.html.Container;
import org.apache.royale.html.DataGrid;
import org.apache.royale.html.DataGridButtonBar;
- import org.apache.royale.html.Container;
+ import org.apache.royale.html.List;
import org.apache.royale.html.beads.IDataGridView;
import org.apache.royale.html.beads.layouts.ButtonBarLayout;
import org.apache.royale.html.beads.models.ButtonBarModel;
@@ -271,7 +274,8 @@
for (var i:int=0; i < sharedModel.columns.length; i++) {
var dataGridColumn:DataGridColumn = sharedModel.columns[i] as DataGridColumn;
- var list:DataGridColumnList = new DataGridColumnList();
+ //var list:DataGridColumnList = new DataGridColumnList();
+ var list:List = dataGridColumn.createList() as List;
list.id = "dataGridColumn"+String(i);
list.dataProvider = sharedModel.dataProvider;
list.itemRenderer = dataGridColumn.itemRenderer;
@@ -280,11 +284,11 @@
list.addBead(presentationModel);
if (i == 0) {
- list.className = "first";
+ list.typeNames = "first";
} else if (i == sharedModel.columns.length-1) {
- list.className = "last";
+ list.typeNames = "last";
} else {
- list.className = "middle";
+ list.typeNames = "middle";
}
_listArea.addElement(list);
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
new file mode 100644
index 0000000..9410e02
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
@@ -0,0 +1,300 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.royale.html.beads
+{
+ import org.apache.royale.collections.ICollectionView;
+ import org.apache.royale.core.IBead;
+ import org.apache.royale.core.IBeadModel;
+ import org.apache.royale.core.IDataProviderItemRendererMapper;
+ import org.apache.royale.core.IDataProviderModel;
+ import org.apache.royale.core.IItemRendererClassFactory;
+ import org.apache.royale.core.IItemRendererParent;
+ import org.apache.royale.core.IListPresentationModel;
+ import org.apache.royale.core.ISelectableItemRenderer;
+ import org.apache.royale.core.ISelectionModel;
+ import org.apache.royale.core.IStrand;
+ import org.apache.royale.core.SimpleCSSStyles;
+ import org.apache.royale.core.UIBase;
+ import org.apache.royale.events.CollectionEvent;
+ import org.apache.royale.events.Event;
+ import org.apache.royale.events.EventDispatcher;
+ import org.apache.royale.events.IEventDispatcher;
+ import org.apache.royale.html.supportClasses.StringItemRenderer;
+ import org.apache.royale.html.supportClasses.UIItemRendererBase;
+ import org.apache.royale.utils.loadBeadFromValuesManager;
+
+
+ /**
+ * This class creates itemRenderer instances from the data contained within an ICollectionView
+ */
+ public class DataItemRendererFactoryForCollectionView extends EventDispatcher implements IBead, IDataProviderItemRendererMapper
+ {
+ public function DataItemRendererFactoryForCollectionView(target:Object = null)
+ {
+ super(target);
+ }
+
+ protected var _strand:IStrand;
+
+ /**
+ * @copy org.apache.royale.core.IBead#strand
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.8
+ */
+ public function set strand(value:IStrand):void
+ {
+ _strand = value;
+ IEventDispatcher(value).addEventListener("initComplete", initComplete);
+ }
+
+ /**
+ * finish setup
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.8
+ */
+ protected function initComplete(event:Event):void
+ {
+ IEventDispatcher(_strand).removeEventListener("initComplete", initComplete);
+
+ var listView:IListView = _strand.getBeadByType(IListView) as IListView;
+ dataGroup = listView.dataGroup;
+
+ var model:IEventDispatcher = _strand.getBeadByType(IBeadModel) as IEventDispatcher;
+ model.addEventListener("dataProviderChanged", dataProviderChangeHandler);
+
+ dataProviderChangeHandler(null);
+ }
+
+ protected var _dataProviderModel:IDataProviderModel;
+
+ /**
+ * The model holding the dataProvider.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.9
+ */
+ public function get dataProviderModel():IDataProviderModel
+ {
+ if (_dataProviderModel == null) {
+ _dataProviderModel = _strand.getBeadByType(IBeadModel) as IDataProviderModel;
+ }
+ return _dataProviderModel;
+ }
+
+ protected var labelField:String;
+
+ private var _itemRendererFactory:IItemRendererClassFactory;
+
+ /**
+ * The org.apache.royale.core.IItemRendererClassFactory used
+ * to generate instances of item renderers.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.8
+ */
+ public function get itemRendererFactory():IItemRendererClassFactory
+ {
+ if(!_itemRendererFactory)
+ _itemRendererFactory = loadBeadFromValuesManager(IItemRendererClassFactory, "iItemRendererClassFactory", _strand) as IItemRendererClassFactory;
+
+ return _itemRendererFactory;
+ }
+
+ /**
+ * @private
+ */
+ public function set itemRendererFactory(value:IItemRendererClassFactory):void
+ {
+ _itemRendererFactory = value;
+ }
+
+ /**
+ * The org.apache.royale.core.IItemRendererParent that will
+ * parent the item renderers.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.8
+ */
+ protected var dataGroup:IItemRendererParent;
+
+ /**
+ * @private
+ */
+ protected function dataProviderChangeHandler(event:Event):void
+ {
+ if (!dataProviderModel)
+ return;
+ var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+ if (!dp)
+ return;
+
+ // listen for individual items being added in the future.
+ var dped:IEventDispatcher = dp as IEventDispatcher;
+ if (!dped.hasEventListener(CollectionEvent.ITEM_ADDED)) {
+ dped.addEventListener(CollectionEvent.ITEM_ADDED, itemAddedHandler);
+ dped.addEventListener(CollectionEvent.ITEM_REMOVED, itemRemovedHandler);
+ dped.addEventListener(CollectionEvent.ITEM_UPDATED, itemUpdatedHandler);
+ }
+
+ dataGroup.removeAllItemRenderers();
+
+ var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+ labelField = dataProviderModel.labelField;
+
+ var n:int = dp.length;
+ for (var i:int = 0; i < n; i++)
+ {
+ var ir:ISelectableItemRenderer = itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+ var item:Object = dp.getItemAt(i);
+ fillRenderer(i, item, ir, presentationModel);
+ }
+
+ IEventDispatcher(_strand).dispatchEvent(new Event("itemsCreated"));
+ }
+
+ /**
+ * @private
+ */
+ protected function itemAddedHandler(event:CollectionEvent):void
+ {
+ if (!dataProviderModel)
+ return;
+ var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+ if (!dp)
+ return;
+
+ var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+ var ir:ISelectableItemRenderer = itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+ labelField = dataProviderModel.labelField;
+
+ fillRenderer(event.index, event.item, ir, presentationModel);
+
+ // update the index values in the itemRenderers to correspond to their shifted positions.
+ var n:int = dataGroup.numElements;
+ for (var i:int = event.index; i < n; i++)
+ {
+ ir = dataGroup.getElementAt(i) as ISelectableItemRenderer;
+ ir.index = i;
+
+ // could let the IR know its index has been changed (eg, it might change its
+ // UI based on the index). Instead (PAYG), allow another bead to detect
+ // this event and do this as not every IR will need to be updated.
+ //var ubase:UIItemRendererBase = ir as UIItemRendererBase;
+ //if (ubase) ubase.updateRenderer()
+ }
+
+ (_strand as IEventDispatcher).dispatchEvent(new Event("itemsCreated"));
+ (_strand as IEventDispatcher).dispatchEvent(new Event("layoutNeeded"));
+ }
+
+ /**
+ * @private
+ */
+ protected function itemRemovedHandler(event:CollectionEvent):void
+ {
+ if (!dataProviderModel)
+ return;
+ var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+ if (!dp)
+ return;
+
+ var ir:ISelectableItemRenderer = dataGroup.getElementAt(event.index) as ISelectableItemRenderer;
+ dataGroup.removeItemRenderer(ir);
+
+ // adjust the itemRenderers' index to adjust for the shift
+ var n:int = dataGroup.numElements;
+ for (var i:int = event.index; i < n; i++)
+ {
+ ir = dataGroup.getElementAt(i) as ISelectableItemRenderer;
+ ir.index = i;
+
+ // could let the IR know its index has been changed (eg, it might change its
+ // UI based on the index). Instead (PAYG), allow another bead to detect
+ // this event and do this as not every IR will need to be updated.
+ //var ubase:UIItemRendererBase = ir as UIItemRendererBase;
+ //if (ubase) ubase.updateRenderer()
+ }
+
+ (_strand as IEventDispatcher).dispatchEvent(new Event("layoutNeeded"));
+ }
+
+ /**
+ * @private
+ */
+ protected function itemUpdatedHandler(event:CollectionEvent):void
+ {
+ if (!dataProviderModel)
+ return;
+ var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+ if (!dp)
+ return;
+
+ var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+
+ // update the given renderer with (possibly) new information so it can change its
+ // appearence or whatever.
+ var ir:ISelectableItemRenderer = dataGroup.getElementAt(event.index) as ISelectableItemRenderer;
+ fillRenderer(event.index, event.item, ir, presentationModel);
+ }
+
+ /**
+ * @private
+ */
+ protected function fillRenderer(index:int,
+ item:Object,
+ itemRenderer:ISelectableItemRenderer,
+ presentationModel:IListPresentationModel):void
+ {
+ dataGroup.addItemRendererAt(itemRenderer, index);
+
+ itemRenderer.labelField = labelField;
+
+ if (presentationModel) {
+ var style:SimpleCSSStyles = new SimpleCSSStyles();
+ style.marginBottom = presentationModel.separatorThickness;
+ UIBase(itemRenderer).style = style;
+ UIBase(itemRenderer).height = presentationModel.rowHeight;
+ UIBase(itemRenderer).percentWidth = 100;
+ }
+
+ setData(itemRenderer, item, index);
+ }
+
+ /**
+ * @private
+ */
+ protected function setData(itemRenderer:ISelectableItemRenderer, data:Object, index:int):void
+ {
+ itemRenderer.index = index;
+ itemRenderer.data = data;
+ }
+ }
+}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as
index f55ab99..87ec5cd 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as
@@ -19,7 +19,10 @@
package org.apache.royale.html.beads
{
import org.apache.royale.collections.FlattenedList;
+ import org.apache.royale.collections.HierarchicalData;
+ import org.apache.royale.collections.TreeData;
import org.apache.royale.core.IBead;
+ import org.apache.royale.core.IBeadModel;
import org.apache.royale.core.IDataProviderItemRendererMapper;
import org.apache.royale.core.IDataProviderModel;
import org.apache.royale.core.IItemRendererClassFactory;
@@ -52,7 +55,7 @@
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
- public class DataItemRendererFactoryForHierarchicalData extends DynamicItemsRendererFactoryForArrayListData
+ public class DataItemRendererFactoryForHierarchicalData extends DataItemRendererFactoryForCollectionView
{
/**
* Constructor.
@@ -94,18 +97,21 @@
*/
override protected function setData(ir:ISelectableItemRenderer, data:Object, index:int):void
{
+ if (!dataProviderModel)
+ return;
+
+ var treeData:TreeData = dataProviderModel.dataProvider as TreeData;
+ var depth:int = treeData.getDepth(data);
+ var isOpen:Boolean = treeData.isOpen(data);
+ var hasChildren:Boolean = treeData.hasChildren(data);
+
// Set the listData with the depth of this item
- var flatList:FlattenedList = dataProviderModel.dataProvider as FlattenedList;
- var depth:int = flatList.getDepth(data);
- var isOpen:Boolean = flatList.isOpen(data);
- var hasChildren:Boolean = flatList.hasChildren(data);
+ var treeListData:TreeListData = new TreeListData();
+ treeListData.depth = depth;
+ treeListData.isOpen = isOpen;
+ treeListData.hasChildren = hasChildren;
- var treeData:TreeListData = new TreeListData();
- treeData.depth = depth;
- treeData.isOpen = isOpen;
- treeData.hasChildren = hasChildren;
-
- ir.listData = treeData;
+ ir.listData = treeListData;
super.setData(ir, data, index);
}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as
index 1d6fccb..e9bb9d0 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as
@@ -18,12 +18,11 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.royale.html.beads.controllers
{
- import org.apache.royale.collections.FlattenedList;
- import org.apache.royale.html.Tree
- import org.apache.royale.events.ItemClickedEvent;
+ import org.apache.royale.collections.TreeData;
import org.apache.royale.core.IStrand;
import org.apache.royale.events.Event;
- import org.apache.royale.events.IEventDispatcher;
+ import org.apache.royale.events.IEventDispatcher;
+ import org.apache.royale.events.ItemClickedEvent;
/**
* The TreeSingleSelectionMouseController class is a controller for
@@ -67,18 +66,18 @@
*/
override protected function selectedHandler(event:ItemClickedEvent):void
{
- var tree:Tree = _strand as Tree;
- var flatList:FlattenedList = listModel.dataProvider as FlattenedList;
- var node:Object = event.data;
+ var treeData:TreeData = listModel.dataProvider as TreeData;
+ if (treeData == null) return;
- if (flatList.isOpen(node)) {
- flatList.closeNode(node);
+ var node:Object = event.data;
+ listModel.selectedItem = node;
+
+ if (treeData.isOpen(node)) {
+ treeData.closeNode(node);
} else {
- flatList.openNode(node);
+ treeData.openNode(node);
}
- listModel.selectedItem = node;
- listModel.dispatchEvent(new Event("dataProviderChanged"));
IEventDispatcher(_strand).dispatchEvent(new Event("change"));
}
}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as
index 419f124..65c8e16 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as
@@ -31,7 +31,7 @@
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
- public class DataGridModel extends ArrayListSelectionModel implements IDataGridModel
+ public class DataGridModel extends SingleSelectionCollectionViewModel implements IDataGridModel
{
/**
* constructor.
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/SingleSelectionCollectionViewModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/SingleSelectionCollectionViewModel.as
new file mode 100644
index 0000000..8bddfdf
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/SingleSelectionCollectionViewModel.as
@@ -0,0 +1,246 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.royale.html.beads.models
+{
+ import org.apache.royale.collections.ICollectionView;
+ import org.apache.royale.core.IRollOverModel;
+ import org.apache.royale.core.ISelectionModel;
+ import org.apache.royale.core.IStrand;
+ import org.apache.royale.events.Event;
+ import org.apache.royale.events.EventDispatcher;
+
+ /**
+ * The SingleSelectionCollectionViewModel class is a selection model for
+ * a dataProvider that is an ICollectionView. 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 Royale 0.0
+ */
+ public class SingleSelectionCollectionViewModel extends EventDispatcher implements ISelectionModel, IRollOverModel
+ {
+ /**
+ * Constructor.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function SingleSelectionCollectionViewModel()
+ {
+ }
+
+ private var _strand:IStrand;
+
+ /**
+ * @copy org.apache.royale.core.IBead#strand
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function set strand(value:IStrand):void
+ {
+ _strand = value;
+ }
+
+ private var _dataProvider:ICollectionView;
+
+ /**
+ * @copy org.apache.royale.core.ISelectionModel#dataProvider
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get dataProvider():Object
+ {
+ return _dataProvider;
+ }
+
+ /**
+ * @private
+ */
+ public function set dataProvider(value:Object):void
+ {
+ if (value == _dataProvider) return;
+
+ _dataProvider = value as ICollectionView;
+ if(!_dataProvider || _selectedIndex >= _dataProvider.length)
+ _selectedIndex = -1;
+
+ _selectedItem = _selectedIndex == -1 ? 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.royale.core.ISelectionModel#labelField
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 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.royale.core.ISelectionModel#selectedIndex
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 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.royale.core.IRollOverModel#rollOverIndex
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.0
+ */
+ public function get rollOverIndex():int
+ {
+ return _rollOverIndex;
+ }
+
+ /**
+ * @private
+ */
+ public function set rollOverIndex(value:int):void
+ {
+ if (value != _rollOverIndex) {
+ _rollOverIndex = value;
+ dispatchEvent(new Event("rollOverIndexChanged"));
+ }
+ }
+
+ private var _selectedItem:Object;
+
+ /**
+ * @copy org.apache.royale.core.ISelectionModel#selectedItem
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 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 Royale 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"));
+ }
+ }
+}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as
index 7171c07..7ffb63d 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as
@@ -21,19 +21,21 @@
import org.apache.royale.collections.ArrayList;
import org.apache.royale.collections.FlattenedList;
import org.apache.royale.collections.HierarchicalData;
+ import org.apache.royale.core.IBeadModel;
+ import org.apache.royale.core.IDataGridModel;
+ import org.apache.royale.events.Event;
import org.apache.royale.utils.ObjectMap;
/**
* The data model for the TreeGrid. This contains the list of TreeGridColumn
- * definitions, the HierarchicalData used to populate the TreeGrid, and
- * the FlattendList of the HD which is actually displayed.
+ * definitions.
*
* @langversion 3.0
* @playerversion Flash 10.2
* @playerversion AIR 2.6
* @productversion Royale 0.9
*/
- public class TreeGridModel extends ArrayListSelectionModel
+ public class TreeGridModel extends TreeModel implements IDataGridModel
{
/**
* Constructor.
@@ -67,33 +69,35 @@
_columns = value;
}
- private var _hierarchicalData:HierarchicalData;
+ // IDataGridModel
+
+ private var _headerModel:IBeadModel;
/**
- * @private
+ * The model to use for the DataGrid's header.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.9
*/
- override public function get dataProvider():Object
+ public function get headerModel():IBeadModel
{
- return _hierarchicalData;
+ return _headerModel;
}
- override public function set dataProvider(value:Object):void
+ public function set headerModel(value:IBeadModel):void
{
- if (value == _hierarchicalData) return;
-
- _hierarchicalData = value as HierarchicalData;
-
- _flatList = new FlattenedList(_hierarchicalData);
- super.dataProvider = _flatList;
+ if (_headerModel != value) {
+ _headerModel = value;
+ dispatchEvent(new Event("headerModelChanged"));
+
+ _headerModel.addEventListener("dataProviderChanged", handleHeaderModelChange);
+ }
}
- private var _flatList:FlattenedList;
-
- /**
- * @private
- */
- public function get flatList():FlattenedList
+ private function handleHeaderModelChange(event:Event):void
{
- return _flatList;
+ dispatchEvent(new Event("headerModelChanged"));
}
}
}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as
new file mode 100644
index 0000000..841d298
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as
@@ -0,0 +1,54 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.royale.html.beads.models
+{
+ import org.apache.royale.collections.HierarchicalData;
+ import org.apache.royale.collections.TreeData;
+ import org.apache.royale.events.CollectionEvent;
+ import org.apache.royale.events.Event;
+
+ /**
+ * The TreeModel is used by Tree
+ */
+ public class TreeModel extends SingleSelectionCollectionViewModel
+ {
+ public function TreeModel()
+ {
+ super();
+ }
+
+ private var _hierarchicalData: HierarchicalData;
+
+ /**
+ * Setting the hierarchicalData in this model is a convenience. The actual
+ * dataProvider is TreeData; this will create that and set it as the
+ * dataProvider. THIS COULD BE REMOVED AS NOTHING SHOULD BE SETTING THIS PROPERTY.
+ */
+ public function set hierarchicalData(value:HierarchicalData):void
+ {
+ _hierarchicalData = value;
+ var treeData:TreeData = new TreeData(_hierarchicalData);
+ dataProvider = treeData;
+ }
+ public function get hierarchicalData():HierarchicalData
+ {
+ return _hierarchicalData;
+ }
+ }
+}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as
index c1eccdd..db15042 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as
@@ -19,6 +19,7 @@
package org.apache.royale.html.supportClasses
{
import org.apache.royale.core.IFactory;
+ import org.apache.royale.core.UIBase;
/**
* The DataGridColumn class is the collection of properties that describe
@@ -66,6 +67,16 @@
_itemRenderer = value;
}
+ private var _columnClass:IFactory;
+ public function get columnClass():IFactory
+ {
+ return _columnClass;
+ }
+ public function set columnClass(value:IFactory):void
+ {
+ _columnClass = value;
+ }
+
private var _columnWidth:Number = Number.NaN;
/**
@@ -123,5 +134,10 @@
{
_dataField = value;
}
+
+ public function createList():UIBase
+ {
+ return new DataGridColumnList();
+ }
}
}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as
index 573ab0f..957a63e 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as
@@ -18,6 +18,9 @@
////////////////////////////////////////////////////////////////////////////////
package org.apache.royale.html.supportClasses
{
+ import org.apache.royale.core.UIBase;
+ import org.apache.royale.html.Tree;
+
/**
* A TreeGridColumn defines the property of a specific column in the TreeGrid.
*
@@ -40,5 +43,10 @@
{
super();
}
+
+ override public function createList():UIBase
+ {
+ return new Tree();
+ }
}
}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as
index c1f9fb6..8065c54 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as
@@ -46,18 +46,22 @@
{
super.data = value;
- var treeData:TreeListData = listData as TreeListData;
+ var treeListData:TreeListData = listData as TreeListData;
var indentSpace:String = " ";
+ var extraSpace:String = " ";
COMPILE::JS {
- indentSpace = " "
+ indentSpace = " ";
+ extraSpace = " ";
}
-
- var indent:String = treeData.hasChildren ? (treeData.isOpen ? "▼" : "▶") : " ";
- for (var i:int=0; i < treeData.depth; i++) {
+
+ var indent:String = "";
+ for (var i:int=0; i < treeListData.depth - 1; i++) {
indent += indentSpace;
}
+ indent += (treeListData.hasChildren ? (treeListData.isOpen ? "▼" : "▶") : "") + extraSpace;
+
this.text = indent + this.text;
}
}
diff --git a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
index a47086f..941586c 100644
--- a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
+++ b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
@@ -32,6 +32,7 @@
import org.apache.royale.collections.HierarchicalData; HierarchicalData;
import org.apache.royale.collections.LazyCollection; LazyCollection;
import org.apache.royale.collections.Collection; Collection;
+ import org.apache.royale.collections.TreeData; TreeData;
}
}
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
index 9bf19f2..8fc316a 100644
--- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
@@ -90,7 +90,7 @@
* @playerversion AIR 2.6
* @productversion Royale 0.0
*/
- public class ArrayList extends EventDispatcher implements IBead, ICollection, IArrayList
+ public class ArrayList extends EventDispatcher implements IBead, ICollectionView, IArrayList
{
/**
* Constructor.
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as
index b0e1915..e0e4b52 100644
--- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as
@@ -133,6 +133,7 @@
addItemAt(arr.shift(), ++i);
}
}
+ updateNode(node);
}
/**
@@ -165,6 +166,16 @@
arr.shift();
}
}
+ updateNode(node);
+ }
+
+ /**
+ * Singles to the node that its state has changed and it should
+ * update itself
+ */
+ public function updateNode(node:Object):void
+ {
+ this.itemUpdated(node);
}
/**
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as
index 1cfae10..e847c3e 100644
--- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as
@@ -64,6 +64,8 @@
// Properties
//
//--------------------------------------------------------------------------
+
+ private var _flatList:FlattenedList;
//--------------------------------------------------------------------------
// childrenField
@@ -263,6 +265,26 @@
{
return source;
}
+
+ public function isOpen(node:Object):Boolean
+ {
+ return _flatList.isOpen(node);
+ }
+
+ public function openNode(node:Object):void
+ {
+ _flatList.openNode(node);
+ }
+
+ public function closeNode(node:Object):void
+ {
+ _flatList.closeNode(node);
+ }
+
+ public function getDepth(node:Object):int
+ {
+ return _flatList.getDepth(node);
+ }
}
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ICollectionView.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ICollectionView.as
new file mode 100644
index 0000000..5071d66
--- /dev/null
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ICollectionView.as
@@ -0,0 +1,38 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.royale.collections
+{
+ /**
+ * The ICollectionView interface is implemented by classes that provide
+ * collection data.
+ */
+ public interface ICollectionView extends ICollection
+ {
+ function get length():int;
+ function getItemIndex(item:Object):int;
+ function addItem(item:Object):void;
+ function addItemAt(item:Object, index:int):void;
+ function setItemAt(item:Object, index:int):Object;
+ function removeItem(item:Object):Boolean;
+ function removeItemAt(index:int):Object;
+ function removeAll():void;
+ function itemUpdated(item:Object):void;
+ function itemUpdatedAt(index:int):void;
+ }
+}
\ No newline at end of file
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as
new file mode 100644
index 0000000..b594c63
--- /dev/null
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as
@@ -0,0 +1,132 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.royale.collections
+{
+ import org.apache.royale.events.EventDispatcher;
+ import org.apache.royale.events.CollectionEvent;
+
+ /**
+ * TreeData is used with tree or structured data classes. This class incorporates
+ * a HierarchicalData structure as its primary source, but then internally flattens
+ * it for presentation.
+ */
+ public class TreeData extends EventDispatcher implements ICollectionView
+ {
+ public function TreeData(source:HierarchicalData)
+ {
+ _hierarchicalData = source;
+ _flatList = new FlattenedList(source);
+
+ _flatList.addEventListener(CollectionEvent.ITEM_ADDED, handleCollectionEvent);
+ _flatList.addEventListener(CollectionEvent.ITEM_REMOVED, handleCollectionEvent);
+ _flatList.addEventListener(CollectionEvent.ITEM_UPDATED, handleCollectionEvent);
+ }
+
+ /**
+ * Forwards CollectionEvents from the internal FlattenedList as if they came
+ * from this TreeData, further mimicking an ICollectionView.
+ *
+ * @private
+ */
+ private function handleCollectionEvent(event:CollectionEvent):void
+ {
+ var newEvent:CollectionEvent = new CollectionEvent(event.type);
+ newEvent.item = event.item;
+ newEvent.index = event.index;
+ dispatchEvent(newEvent);
+ }
+
+ private var _hierarchicalData:HierarchicalData;
+ private var _flatList:FlattenedList;
+
+ // Working with Trees
+
+ public function hasChildren(node:Object):Boolean
+ {
+ return _flatList.hasChildren(node);
+ }
+
+ public function isOpen(node:Object):Boolean
+ {
+ return _flatList.isOpen(node);
+ }
+
+ public function openNode(node:Object):void
+ {
+ _flatList.openNode(node);
+ }
+
+ public function closeNode(node:Object):void
+ {
+ _flatList.closeNode(node);
+ }
+
+ public function getDepth(node:Object):int
+ {
+ return _flatList.getDepth(node);
+ }
+
+ // ICollectionData
+
+ public function get length():int
+ {
+ return _flatList.length;
+ }
+ public function getItemAt(index:int):Object
+ {
+ return _flatList.getItemAt(index);
+ }
+ public function getItemIndex(item:Object):int
+ {
+ return _flatList.getItemIndex(item);
+ }
+ public function addItem(item:Object):void
+ {
+ _flatList.addItem(item);
+ }
+ public function addItemAt(item:Object, index:int):void
+ {
+ _flatList.addItemAt(item, index);
+ }
+ public function setItemAt(item:Object, index:int):Object
+ {
+ return _flatList.setItemAt(item, index);
+ }
+ public function removeItem(item:Object):Boolean
+ {
+ return _flatList.removeItem(item);
+ }
+ public function removeItemAt(index:int):Object
+ {
+ return _flatList.removeItemAt(index);
+ }
+ public function removeAll():void
+ {
+ _flatList.removeAll();
+ }
+ public function itemUpdated(item:Object):void
+ {
+ _flatList.itemUpdated(item);
+ }
+ public function itemUpdatedAt(index:int):void
+ {
+ _flatList.itemUpdatedAt(index);
+ }
+ }
+}
\ No newline at end of file