You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by pi...@apache.org on 2017/12/13 21:57:49 UTC

[royale-asjs] branch develop updated: Add DynamicRemoveAllItemRendererForArrayListData

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 23c00b3  Add DynamicRemoveAllItemRendererForArrayListData
23c00b3 is described below

commit 23c00b33bb5c6cb3019a50b265dd165d3e8ce78f
Author: Piotr Zarzycki <pi...@gmail.com>
AuthorDate: Wed Dec 13 22:57:42 2017 +0100

    Add DynamicRemoveAllItemRendererForArrayListData
    
    - Add DynamicRemoveAllItemRendererForArrayListData which helps to handle scenario where all items has been removed from ArrayList
    - Introduce ALL_ITEMS_REMOVED (allItemsRemoved) event type in CollectionEvent
    - Update MDLDynamicTableExample to reflect changes
---
 .../MDLDynamicTableExample/src/MainView.mxml       |   9 ++
 .../Basic/src/main/resources/basic-manifest.xml    |   1 +
 ...DynamicRemoveAllItemRendererForArrayListData.as | 164 +++++++++++++++++++++
 .../org/apache/royale/collections/ArrayList.as     |  13 +-
 .../org/apache/royale/events/CollectionEvent.as    |   1 +
 5 files changed, 187 insertions(+), 1 deletion(-)

diff --git a/examples/royale/MDLDynamicTableExample/src/MainView.mxml b/examples/royale/MDLDynamicTableExample/src/MainView.mxml
index e7234d8..e484cac 100644
--- a/examples/royale/MDLDynamicTableExample/src/MainView.mxml
+++ b/examples/royale/MDLDynamicTableExample/src/MainView.mxml
@@ -35,6 +35,11 @@ limitations under the License.
 			usersListModel.users.removeItemAt(usersListModel.users.length - 1);
 		}		
 		
+		private function onRemoveAllClick(event:MouseEvent):void
+		{
+			usersListModel.users.removeAll();	
+		}		
+		
 		private function onTblChange(event:Event):void
 		{
 			var selIndex:int = tblUsers.selectedIndex;
@@ -63,6 +68,7 @@ limitations under the License.
 			<mdl:beads>
 				<js:DynamicItemsRendererFactoryForArrayListData />
 				<js:DynamicRemoveItemRendererForArrayListData />
+				<js:DynamicRemoveAllItemRendererForArrayListData />
 			</mdl:beads>
 		</mdl:Table>
 	</mdl:GridCell>
@@ -72,4 +78,7 @@ limitations under the License.
 	<mdl:GridCell>
 		<mdl:Button text="Remove Last Employee" width="100" click="onRemoveEmployeeClick(event)"/>
 	</mdl:GridCell>
+	<mdl:GridCell>
+		<mdl:Button text="Remove All" width="130" click="onRemoveAllClick(event)"/>
+	</mdl:GridCell>
 </mdl:Grid>
diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index 81ad5b3..d0bf629 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -153,6 +153,7 @@
     <component id="DynamicItemsRendererFactoryForArrayListData" class="org.apache.royale.html.beads.DynamicItemsRendererFactoryForArrayListData" />
     <component id="DynamicRemoveItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveItemRendererForArrayListData" />
     <component id="DataItemRendererFactoryForHierarchicalData" class="org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData" />
+    <component id="DynamicRemoveAllItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveAllItemRendererForArrayListData" />
     <component id="TextItemRendererFactoryForArrayData" class="org.apache.royale.html.beads.TextItemRendererFactoryForArrayData" />
     <component id="TextItemRendererFactoryForStringVectorData" class="org.apache.royale.html.beads.TextItemRendererFactoryForStringVectorData" />
 
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as
new file mode 100644
index 0000000..5111037
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as
@@ -0,0 +1,164 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.core.IBead;
+	import org.apache.royale.core.IDataProviderModel;
+	import org.apache.royale.core.IItemRendererParent;
+	import org.apache.royale.core.IList;
+	import org.apache.royale.core.ISelectionModel;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.core.UIBase;
+	import org.apache.royale.events.CollectionEvent;
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.IEventDispatcher;
+
+	/**
+	 * Handles the removal of all itemRenderers once the corresponding datum has been removed
+	 * from the IDataProviderModel.
+	 *
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10.2
+	 *  @playerversion AIR 2.6
+	 *  @productversion Royale 0.9.0
+	 */
+	public class DynamicRemoveAllItemRendererForArrayListData implements IBead
+	{
+		/**
+		 * Constructor
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.0
+		 */
+		public function DynamicRemoveAllItemRendererForArrayListData()
+		{
+		}
+
+		private var _strand:IStrand;
+
+		/**
+		 * @copy org.apache.royale.core.IStrand
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.0
+		 */
+		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);
+			
+			_dataProviderModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel;
+			dataProviderModel.addEventListener("dataProviderChanged", dataProviderChangeHandler);	
+			
+			// invoke now in case "dataProviderChanged" has already been dispatched.
+			dataProviderChangeHandler(null);
+		}
+		
+		/**
+		 * @private
+		 */
+		protected function dataProviderChangeHandler(event:Event):void
+		{
+			var dp:IEventDispatcher = dataProviderModel.dataProvider as IEventDispatcher;
+			if (!dp)
+				return;
+			
+			// listen for all items being removed in the future.
+			dp.addEventListener(CollectionEvent.ALL_ITEMS_REMOVED, handleAllItemsRemoved);
+		}
+
+		/**
+		 * Handles the itemRemoved event by removing the item.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.0
+		 */
+		protected function handleAllItemsRemoved(event:CollectionEvent):void
+		{
+			if (dataProviderModel is ISelectionModel)
+			{
+				var model:ISelectionModel = dataProviderModel as ISelectionModel;
+				model.selectedIndex = -1;
+				model.selectedItem = null;
+			}
+			var parent:UIBase = itemRendererParent as UIBase;
+			itemRendererParent.removeAllItemRenderers();
+
+			(_strand as IEventDispatcher).dispatchEvent(new Event("layoutNeeded"));
+		}
+
+		private var _dataProviderModel: IDataProviderModel;
+
+		/**
+		 *  The org.apache.royale.core.IDataProviderModel that contains the
+		 *  data source.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.0
+		 */
+		public function get dataProviderModel(): IDataProviderModel
+		{
+			if (_dataProviderModel == null) {
+				_dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
+			}
+			return _dataProviderModel;
+		}
+
+		private var _itemRendererParent: IItemRendererParent;
+
+		/**
+		 *  The org.apache.royale.core.IItemRendererParent used
+		 *  to generate instances of item renderers.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.0
+		 */
+		public function get itemRendererParent():IItemRendererParent
+		{
+			if (_itemRendererParent == null) {
+				var list:IList = _strand as IList;
+				_itemRendererParent = list.dataGroup;
+			}
+			return _itemRendererParent;
+		}
+	}
+}
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 b7f1b98..9bf19f2 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
@@ -60,6 +60,16 @@ package org.apache.royale.collections
 	 */
 	[Event(name="itemRemoved", type="org.apache.royale.events.CollectionEvent")]
 
+    /**
+     *  Dispatched when the collection has updated an item.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     */
+    [Event(name="allItemsRemoved", type="org.apache.royale.events.CollectionEvent")]
+
 	/**
 	 *  Dispatched when the collection has updated an item.
 	 *
@@ -358,8 +368,9 @@ package org.apache.royale.collections
 		{
 			if (length > 0)
 			{
-                var collectionEvent:CollectionEvent = new CollectionEvent(CollectionEvent.ITEM_REMOVED);
+                var collectionEvent:CollectionEvent = new CollectionEvent(CollectionEvent.ALL_ITEMS_REMOVED);
                 collectionEvent.items = source.splice(0, length);
+				collectionEvent.index = -1;
                 dispatchEvent(collectionEvent);
 			}
 		}
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/CollectionEvent.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/CollectionEvent.as
index 844fc9d..6831ca5 100644
--- a/frameworks/projects/Core/src/main/royale/org/apache/royale/events/CollectionEvent.as
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/events/CollectionEvent.as
@@ -31,6 +31,7 @@ package org.apache.royale.events
 	{
 		public static const ITEM_ADDED:String = "itemAdded";
 		public static const ITEM_REMOVED:String = "itemRemoved";
+        public static const ALL_ITEMS_REMOVED:String = "allItemsRemoved";
 		public static const ITEM_UPDATED:String = "itemUpdated";
 		public static const COLLECTION_CHANGED:String = "collectionChanged";
 

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