You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by pe...@apache.org on 2018/01/05 16:30:15 UTC

[royale-asjs] 02/02: Updates to the ICollectionView classes and Tree classes.

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

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

commit e44164d15408765a02ef0843babaa9a9c1518ec2
Author: Peter Ent <pe...@apache.org>
AuthorDate: Fri Jan 5 11:31:22 2018 -0500

    Updates to the ICollectionView classes and Tree classes.
---
 .../DataItemRendererFactoryForCollectionView.as    | 79 +++++++++++++++++++---
 .../TreeSingleSelectionMouseController.as          |  3 +-
 .../apache/royale/html/beads/models/TreeModel.as   |  2 +
 .../org/apache/royale/collections/FlattenedList.as | 11 +++
 .../org/apache/royale/collections/TreeData.as      | 19 ++++++
 5 files changed, 104 insertions(+), 10 deletions(-)

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 @@ package org.apache.royale.html.beads
 	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 @@ package org.apache.royale.html.beads
 				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 @@ package org.apache.royale.html.beads
 			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 @@ package org.apache.royale.html.beads
 		/**
 		 * @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 @@ package org.apache.royale.html.beads.controllers
 			if (treeData == null) return;
 			
 			var node:Object = event.data;
+			listModel.selectedItem = node;
 			
 			if (treeData.isOpen(node)) {
 				treeData.closeNode(node);
@@ -77,8 +78,6 @@ package org.apache.royale.html.beads.controllers
 				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 @@ 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
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 @@ package org.apache.royale.collections
 					addItemAt(arr.shift(), ++i);
 				}
 			}
+			updateNode(node);
 		}
 		
 		/**
@@ -165,6 +166,16 @@ package org.apache.royale.collections
 					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 @@ package org.apache.royale.collections
 		{
 			_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;

-- 
To stop receiving notification emails like this one, please contact
"commits@royale.apache.org" <co...@royale.apache.org>.