You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ca...@apache.org on 2018/11/06 17:25:42 UTC

[royale-asjs] branch develop updated: fix selectedItem in Jewel DropDownList

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

carlosrovira 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 6f686a1  fix selectedItem in Jewel DropDownList
6f686a1 is described below

commit 6f686a1043ce177f56d82b68e0f1a803b85e095b
Author: Carlos Rovira <ca...@apache.org>
AuthorDate: Tue Nov 6 18:25:34 2018 +0100

    fix selectedItem in Jewel DropDownList
---
 .../src/main/royale/DropDownListPlayGround.mxml    |   6 +-
 .../projects/Jewel/src/main/resources/defaults.css |   1 +
 .../projects/Jewel/src/main/royale/JewelClasses.as |   1 +
 .../royale/org/apache/royale/jewel/DropDownList.as |   4 +
 .../beads/controllers/DropDownListController.as    | 129 ++++++++++++++-------
 .../royale/jewel/beads/models/DropDownListModel.as |   6 +-
 .../royale/jewel/beads/views/DropDownListView.as   |  32 +++++
 .../apache/royale/jewel/beads/views/ListView.as    |   7 +-
 .../src/main/sass/components/_dropdownlist.sass    |   2 +-
 9 files changed, 136 insertions(+), 52 deletions(-)

diff --git a/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml b/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml
index 8d8d7bf..152939c 100644
--- a/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml
+++ b/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml
@@ -297,7 +297,11 @@ limitations under the License.
 								tabletNumerator="1" tabletDenominator="3"
 								phoneNumerator="1" phoneDenominator="1"
 								itemsVerticalAlign="itemsCentered" width="290">
-						<j:DropDownList id="avengersDropDownList_withSelectedItem" selectedItem="{listModel.avengers.getItemAt(4)}" labelField="label" dataProvider="{listModel.avengers}" change="avengersDropDownListHandler_withSelectedItem(event)">
+						<j:DropDownList id="avengersDropDownList_withSelectedItem" 
+										labelField="label"
+										dataProvider="{listModel.avengers}" 
+										selectedItem="{listModel.avengers.getItemAt(4)}"  
+										change="avengersDropDownListHandler_withSelectedItem(event)">
 							<j:beads>
 								<j:DropDownListTextPrompt prompt="Select Avengers..."/>
 							</j:beads>
diff --git a/frameworks/projects/Jewel/src/main/resources/defaults.css b/frameworks/projects/Jewel/src/main/resources/defaults.css
index 40a5949..670d18a 100644
--- a/frameworks/projects/Jewel/src/main/resources/defaults.css
+++ b/frameworks/projects/Jewel/src/main/resources/defaults.css
@@ -707,6 +707,7 @@ j|DropDownList {
   IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.DropDownListItemRendererFactoryForCollectionView");
   IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
   IItemRenderer: ClassReference("org.apache.royale.jewel.itemRenderers.DropDownListItemRenderer");
+  IBeadController: ClassReference("org.apache.royale.jewel.beads.controllers.DropDownListController");
 }
 
 @media -royale-swf {
diff --git a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
index 270034b..f422325 100644
--- a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
+++ b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
@@ -49,6 +49,7 @@ package
         import org.apache.royale.jewel.beads.controllers.TableCellSelectionMouseController; TableCellSelectionMouseController;
         import org.apache.royale.jewel.beads.controllers.ComboBoxController; ComboBoxController;
 		import org.apache.royale.jewel.beads.controllers.SnackbarController; SnackbarController;
+		import org.apache.royale.jewel.beads.controllers.DropDownListController; DropDownListController;
         
         import org.apache.royale.jewel.beads.views.ImageView; ImageView;
         import org.apache.royale.jewel.beads.views.SpinnerView; SpinnerView;
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as
index df99ae0..09d023d 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as
@@ -234,6 +234,10 @@ package org.apache.royale.jewel
         public function set selectedItem(value:Object):void
         {
             ISelectionModel(model).selectedItem = value;
+            COMPILE::JS
+            {
+                (element as HTMLSelectElement).selectedIndex = ISelectionModel(model).selectedIndex + 1;
+            }
         }
 
         /**
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as
index 9a75211..162e103 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as
@@ -18,19 +18,18 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.jewel.beads.controllers
 {
-	import flash.display.DisplayObject;
-	import flash.geom.Point;
+	// import flash.display.DisplayObject;
+	// import flash.geom.Point;
 	
-	import org.apache.royale.core.IBead;
 	import org.apache.royale.core.IBeadController;
-	import org.apache.royale.core.ISelectionModel;
 	import org.apache.royale.core.IStrand;
-	import org.apache.royale.core.IUIBase;
-	import org.apache.royale.core.UIBase;
 	import org.apache.royale.events.Event;
 	import org.apache.royale.events.IEventDispatcher;
-	import org.apache.royale.events.MouseEvent;
-	import org.apache.royale.html.beads.IDropDownListView;
+	import org.apache.royale.events.ItemAddedEvent;
+	import org.apache.royale.events.ItemClickedEvent;
+	import org.apache.royale.events.ItemRemovedEvent;
+	import org.apache.royale.jewel.beads.models.DropDownListModel;
+	import org.apache.royale.jewel.beads.views.DropDownListView;
 
     /**
      *  The DropDownListController class is the controller for
@@ -46,7 +45,7 @@ package org.apache.royale.jewel.beads.controllers
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.9.4
      */
-	public class DropDownListController implements IBead, IBeadController
+	public class DropDownListController implements IBeadController
 	{
         /**
          *  Constructor.
@@ -60,8 +59,27 @@ package org.apache.royale.jewel.beads.controllers
 		{
 		}
 		
+        /**
+         *  The model.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.4
+         */
+		protected var model:DropDownListModel;
+
+        /**
+         *  The view.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.4
+         */
+        protected var view:DropDownListView;
+
 		private var _strand:IStrand;
-		
         /**
          *  @copy org.apache.royale.core.IBead#strand
          *  
@@ -73,45 +91,72 @@ package org.apache.royale.jewel.beads.controllers
 		public function set strand(value:IStrand):void
 		{
 			_strand = value;
-            IEventDispatcher(value).addEventListener(org.apache.royale.events.MouseEvent.CLICK, clickHandler);
+            model = value.getBeadByType(DropDownListModel) as DropDownListModel;
+            IEventDispatcher(_strand).addEventListener("itemAdded", handleItemAdded);
+			IEventDispatcher(_strand).addEventListener("itemRemoved", handleItemRemoved);
+            //IEventDispatcher(value).addEventListener(org.apache.royale.events.MouseEvent.CLICK, clickHandler);
+		}
+
+        /**
+         * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+         */
+		protected function handleItemAdded(event:ItemAddedEvent):void
+		{
+			IEventDispatcher(event.item).addEventListener("itemClicked", selectedHandler);
 		}
 		
-        private function clickHandler(event:org.apache.royale.events.MouseEvent):void
+        /**
+         * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+         */
+		protected function handleItemRemoved(event:ItemRemovedEvent):void
+		{
+			IEventDispatcher(event.item).removeEventListener("itemClicked", selectedHandler);
+		}
+
+        protected function selectedHandler(event:ItemClickedEvent):void
         {
-            var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView;
-            var selectionModel:ISelectionModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel;
-            var popUpModel:ISelectionModel = UIBase(viewBead.popUp).model as ISelectionModel;
-            DisplayObject(viewBead.popUp).width = DisplayObject(_strand).width;
-            popUpModel.dataProvider = selectionModel.dataProvider;
-            popUpModel.labelField = selectionModel.labelField;
-            viewBead.popUpVisible = true; // adds to display list as well
-            popUpModel.selectedIndex = selectionModel.selectedIndex;
-            var pt:Point = new Point(DisplayObject(_strand).x, DisplayObject(_strand).y + DisplayObject(_strand).height);
-            pt = DisplayObject(_strand).parent.localToGlobal(pt);
-			DisplayObject(viewBead.popUp).x = pt.x;
-			DisplayObject(viewBead.popUp).y = pt.y;
-            IEventDispatcher(viewBead.popUp).addEventListener(Event.CHANGE, changeHandler);
-            IUIBase(_strand).topMostEventDispatcher.addEventListener(org.apache.royale.events.MouseEvent.CLICK, dismissHandler);
+            model.selectedIndex = event.index;
+			model.selectedItem = event.data;
+            view.host.dispatchEvent(new Event(Event.CHANGE));
+            trace(model, model.selectedIndex, model.selectedItem, view.host);
         }
+		
+        // private function clickHandler(event:org.apache.royale.events.MouseEvent):void
+        // {
+        //     var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView;
+        //     var selectionModel:ISelectionModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel;
+        //     var popUpModel:ISelectionModel = UIBase(viewBead.popUp).model as ISelectionModel;
+        //     DisplayObject(viewBead.popUp).width = DisplayObject(_strand).width;
+        //     popUpModel.dataProvider = selectionModel.dataProvider;
+        //     popUpModel.labelField = selectionModel.labelField;
+        //     viewBead.popUpVisible = true; // adds to display list as well
+        //     popUpModel.selectedIndex = selectionModel.selectedIndex;
+        //     var pt:Point = new Point(DisplayObject(_strand).x, DisplayObject(_strand).y + DisplayObject(_strand).height);
+        //     pt = DisplayObject(_strand).parent.localToGlobal(pt);
+		// 	DisplayObject(viewBead.popUp).x = pt.x;
+		// 	DisplayObject(viewBead.popUp).y = pt.y;
+        //     IEventDispatcher(viewBead.popUp).addEventListener(Event.CHANGE, changeHandler);
+        //     IUIBase(_strand).topMostEventDispatcher.addEventListener(org.apache.royale.events.MouseEvent.CLICK, dismissHandler);
+        // }
         
-        private function dismissHandler(event:org.apache.royale.events.MouseEvent):void
-        {
-            if (event.target == _strand) return;
+        // private function dismissHandler(event:org.apache.royale.events.MouseEvent):void
+        // {
+        //     if (event.target == _strand) return;
             
-            IUIBase(_strand).topMostEventDispatcher.removeEventListener(org.apache.royale.events.MouseEvent.CLICK, dismissHandler);
-            var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView;
-            viewBead.popUpVisible = false;
-        }
+        //     IUIBase(_strand).topMostEventDispatcher.removeEventListener(org.apache.royale.events.MouseEvent.CLICK, dismissHandler);
+        //     var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView;
+        //     viewBead.popUpVisible = false;
+        // }
         
-        private function changeHandler(event:Event):void
-        {
-            var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView;
-            viewBead.popUpVisible = false;
-            var selectionModel:ISelectionModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel;
-            var popUpModel:ISelectionModel = UIBase(viewBead.popUp).model as ISelectionModel;
-            selectionModel.selectedIndex = popUpModel.selectedIndex;
-			IEventDispatcher(_strand).dispatchEvent(new Event(Event.CHANGE));
-        }
+        // private function changeHandler(event:Event):void
+        // {
+        //     var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView;
+        //     viewBead.popUpVisible = false;
+        //     var selectionModel:ISelectionModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel;
+        //     var popUpModel:ISelectionModel = UIBase(viewBead.popUp).model as ISelectionModel;
+        //     selectionModel.selectedIndex = popUpModel.selectedIndex;
+		// 	IEventDispatcher(_strand).dispatchEvent(new Event(Event.CHANGE));
+        // }
 	
 	}
 }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/DropDownListModel.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/DropDownListModel.as
index 9deb18c..f2204a3 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/DropDownListModel.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/DropDownListModel.as
@@ -121,12 +121,12 @@ package org.apache.royale.jewel.beads.models
             if (value == _selectedItem) return;
 
 			_selectedItem = value;
-			var n:int = _dataProvider.length + offset;
-			for (var i:int = 1; i < n; i++)
+			var n:int = _dataProvider.length;
+			for (var i:int = 0; i < n; i++)
 			{
 				if (_dataProvider.getItemAt(i) == value)
 				{
-					_selectedIndex = i - offset;
+					_selectedIndex = i;
 					break;
 				}
 			}
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DropDownListView.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DropDownListView.as
index 66822fa..0a25b9a 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DropDownListView.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/DropDownListView.as
@@ -27,6 +27,7 @@ package org.apache.royale.jewel.beads.views
     import org.apache.royale.events.Event;
     import org.apache.royale.html.beads.DataContainerView;
     import org.apache.royale.jewel.DropDownList;
+    import org.apache.royale.core.ISelectableItemRenderer;
 
     /**
      *  The DropDownListView class creates the visual elements of the org.apache.royale.jewel.DropDownList
@@ -91,6 +92,36 @@ package org.apache.royale.jewel.beads.views
             changedSelection();
         }
 
+        /**
+		 * @private
+		 * @royaleignorecoercion org.apache.royale.core.ISelectionModel
+		 */
+		override protected function handleInitComplete(event:Event):void
+		{
+			model = _strand.getBeadByType(ISelectionModel) as ISelectionModel;
+			model.addEventListener("selectedIndexChanged", selectionChangeHandler);
+			
+			super.handleInitComplete(event);
+		}
+
+
+        protected var lastSelectedIndex:int = -1;
+        /**
+		 * @private
+		 * @royaleignorecoercion org.apache.royale.core.ISelectableItemRenderer
+		 */
+		protected function selectionChangeHandler(event:Event):void
+		{
+            var ir:ISelectableItemRenderer = dataGroup.getItemRendererAt(lastSelectedIndex) as ISelectableItemRenderer;
+			if(ir)
+				ir.selected = false;
+			ir = dataGroup.getItemRendererAt(model.selectedIndex) as ISelectableItemRenderer;
+			if(ir)
+				ir.selected = true;
+
+			lastSelectedIndex = model.selectedIndex;
+        }
+
         override protected function itemsCreatedHandler(event:org.apache.royale.events.Event):void
         {
             super.itemsCreatedHandler(event);
@@ -108,6 +139,7 @@ package org.apache.royale.jewel.beads.views
             if (model.selectedIndex > -1 && model.dataProvider)
             {
                 dropDownList.selectedIndex = model.selectedIndex;
+                dropDownList.selectedItem = model.selectedItem;
             }
         }
     }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as
index a9bad6c..3f6ab5d 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as
@@ -18,7 +18,8 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.jewel.beads.views
 {
-	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IItemRendererParent;
+	import org.apache.royale.core.ILayoutView;
 	import org.apache.royale.core.IRollOverModel;
 	import org.apache.royale.core.ISelectableItemRenderer;
 	import org.apache.royale.core.ISelectionModel;
@@ -26,10 +27,6 @@ package org.apache.royale.jewel.beads.views
 	import org.apache.royale.events.Event;
 	import org.apache.royale.events.IEventDispatcher;
 	import org.apache.royale.html.beads.DataContainerView;
-	import org.apache.royale.core.IItemRendererParent;
-	import org.apache.royale.core.IContentView;
-	import org.apache.royale.utils.loadBeadFromValuesManager;
-	import org.apache.royale.core.ILayoutView;
 
 	/**
 	 *  The ListView class creates the visual elements of the org.apache.royale.jewel.List
diff --git a/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass b/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass
index 5c3fcdb..1349890 100644
--- a/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass
+++ b/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass
@@ -50,7 +50,7 @@ j|DropDownList
     IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.DropDownListItemRendererFactoryForCollectionView")
     IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory")
     IItemRenderer: ClassReference("org.apache.royale.jewel.itemRenderers.DropDownListItemRenderer")
-    // IBeadController: ClassReference("org.apache.royale.mdl.beads.controllers.DropDownListController")
+    IBeadController: ClassReference("org.apache.royale.jewel.beads.controllers.DropDownListController")
 
     // IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForArrayData")