Updates to the ICollectionView classes and Tree classes.
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
index 9cbd1ce..9410e02 100644
--- 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
@@ -36,9 +36,8 @@
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;
-
- [Event(name="itemRendererCreated",type="org.apache.royale.events.ItemRendererEvent")]
/**
@@ -158,7 +157,12 @@
return;
// listen for individual items being added in the future.
- (dp as IEventDispatcher).addEventListener(CollectionEvent.ITEM_ADDED, itemAddedHandler);
+ 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();
@@ -187,17 +191,26 @@
if (!dp)
return;
- if (dataProviderModel is ISelectionModel) {
- var model:ISelectionModel = dataProviderModel as ISelectionModel;
- model.selectedIndex = -1;
- }
-
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"));
}
@@ -205,6 +218,56 @@
/**
* @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,
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 9147039..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
@@ -70,6 +70,7 @@
if (treeData == null) return;
var node:Object = event.data;
+ listModel.selectedItem = node;
if (treeData.isOpen(node)) {
treeData.closeNode(node);
@@ -77,8 +78,6 @@
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/TreeModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as
index c38beb3..841d298 100644
--- 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
@@ -20,6 +20,8 @@
{
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
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/TreeData.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as
index 4b9f639..b594c63 100644
--- 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
@@ -19,6 +19,7 @@
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
@@ -31,6 +32,24 @@
{
_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;