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/08/24 16:08:10 UTC

[royale-asjs] branch develop updated: Jewel DropDownList refactor to get Collection works and introduce ItemRenderers

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 5b16892  Jewel DropDownList refactor to get Collection works and introduce ItemRenderers
5b16892 is described below

commit 5b16892548944d8d0de494f0dd818e0b80e0f88b
Author: Carlos Rovira <ca...@apache.org>
AuthorDate: Fri Aug 24 18:08:05 2018 +0200

    Jewel DropDownList refactor to get Collection works and introduce ItemRenderers
---
 .../src/main/royale/DropDownListPlayGround.mxml    |   9 +-
 .../src/main/royale/models/ListsModel.as           |   7 +-
 .../projects/Jewel/src/main/resources/defaults.css |  11 +-
 .../Jewel/src/main/resources/jewel-manifest.xml    |   1 +
 .../projects/Jewel/src/main/royale/JewelClasses.as |   5 +-
 .../royale/org/apache/royale/jewel/DropDownList.as | 225 ++++++++-----
 .../royale/jewel/beads/views/DropDownListView.as   | 351 ++++++---------------
 .../itemRenderers/DropDownListItemRenderer.as      | 104 ++++++
 .../src/main/sass/components/_dropdownlist.sass    |  14 +-
 9 files changed, 380 insertions(+), 347 deletions(-)

diff --git a/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml b/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml
index 4dbdeac..a0c219b 100644
--- a/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml
+++ b/examples/royale/JewelExample/src/main/royale/DropDownListPlayGround.mxml
@@ -20,7 +20,8 @@ limitations under the License.
 <j:SectionContent xmlns:fx="http://ns.adobe.com/mxml/2009"
 				xmlns:j="library://ns.apache.org/royale/jewel"
 				xmlns:js="library://ns.apache.org/royale/basic"
-				xmlns:html="library://ns.apache.org/royale/html">
+				xmlns:html="library://ns.apache.org/royale/html"
+				xmlns:models="models.*">
     
 	<fx:Script>
 		<![CDATA[      
@@ -42,12 +43,16 @@ limitations under the License.
 	<j:beads>
 		<js:ContainerDataBinding/>
 	</j:beads>
+
+	<j:model>
+        <models:ListsModel id="listModel"/>
+	</j:model>
 	
 	<j:Card width="350">
 		
 		<html:H3 text="Jewel DropDownList"/>
 		
-		<j:DropDownList dataProvider="{strings}"/>
+		<j:DropDownList dataProvider="{listModel.watchmen}" change="changeHandler(event)"/>
 
 		<!-- <j:DropDownList change="changeHandler(event)">
 			<j:dataProvider>
diff --git a/examples/royale/JewelExample/src/main/royale/models/ListsModel.as b/examples/royale/JewelExample/src/main/royale/models/ListsModel.as
index c25ab93..9f3e468 100644
--- a/examples/royale/JewelExample/src/main/royale/models/ListsModel.as
+++ b/examples/royale/JewelExample/src/main/royale/models/ListsModel.as
@@ -21,21 +21,22 @@ package models
 	import vos.IconListVO;
 	import org.apache.royale.collections.ArrayList;
 
+	[Bindable]
 	public class ListsModel 
 	{
 		/**
 		 * Used in the List example.
 		 */
-		private var _watchmen:Array = [
+		private var _watchmen:ArrayList = new ArrayList([
 			"The Comedian", 
 			"Doctor Manhattan", 
 			"Nite Owl",
 			"Ozymandias",
             "Rorschach",
             "Silk Spectre"
-		];
+		]);
 		
-		public function get watchmen():Array
+		public function get watchmen():ArrayList
 		{
 			return _watchmen;
 		}
diff --git a/frameworks/projects/Jewel/src/main/resources/defaults.css b/frameworks/projects/Jewel/src/main/resources/defaults.css
index 05c6649..77e4ec2 100644
--- a/frameworks/projects/Jewel/src/main/resources/defaults.css
+++ b/frameworks/projects/Jewel/src/main/resources/defaults.css
@@ -472,10 +472,17 @@ j|DateField {
   touch-action: pan-y;
 }
 
+j|DropDownList {
+  IBeadView: ClassReference("org.apache.royale.jewel.beads.views.DropDownListView");
+  IBeadModel: ClassReference("org.apache.royale.jewel.beads.models.ArrayListSelectionModel");
+  IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.DataItemRendererFactoryForCollectionView");
+  IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
+  IItemRenderer: ClassReference("org.apache.royale.jewel.itemRenderers.DropDownListItemRenderer");
+}
+
 @media -royale-swf {
   j|DropDownList {
-    IBeadModel: ClassReference("org.apache.royale.html.beads.models.ArraySelectionModel");
-    IBeadView: ClassReference("org.apache.royale.jewel.beads.views.DropDownListView");
+    IBeadModel: ClassReference("org.apache.royale.jewel.beads.models.ArrayListSelectionModel");
     IBeadController: ClassReference("org.apache.royale.jewel.beads.controllers.DropDownListController");
     IPopUp: ClassReference("org.apache.royale.jewel.supportClasses.dropdownlist.DropDownListList");
   }
diff --git a/frameworks/projects/Jewel/src/main/resources/jewel-manifest.xml b/frameworks/projects/Jewel/src/main/resources/jewel-manifest.xml
index e5691b9..471cd89 100644
--- a/frameworks/projects/Jewel/src/main/resources/jewel-manifest.xml
+++ b/frameworks/projects/Jewel/src/main/resources/jewel-manifest.xml
@@ -112,6 +112,7 @@
     <component id="ListItemRenderer" class="org.apache.royale.jewel.itemRenderers.ListItemRenderer"/>
     <component id="TableItemRenderer" class="org.apache.royale.jewel.itemRenderers.TableItemRenderer"/>
     <component id="DateItemRenderer" class="org.apache.royale.jewel.itemRenderers.DateItemRenderer"/>
+    <component id="DropDownListItemRenderer" class="org.apache.royale.jewel.itemRenderers.DropDownListItemRenderer"/>
     
     <component id="ScrollingViewport" class="org.apache.royale.jewel.supportClasses.scrollbar.ScrollingViewport"/>
 
diff --git a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
index bf716a9..d9882ce 100644
--- a/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
+++ b/frameworks/projects/Jewel/src/main/royale/JewelClasses.as
@@ -50,10 +50,11 @@ package
         import org.apache.royale.jewel.beads.views.TitleBarView; TitleBarView;
         import org.apache.royale.jewel.beads.views.AlertTitleBarView; AlertTitleBarView;
         import org.apache.royale.jewel.beads.views.ListView; ListView;
+        import org.apache.royale.jewel.beads.views.DropDownListView; DropDownListView;
         import org.apache.royale.jewel.beads.views.DateChooserView; DateChooserView;
-        import org.apache.royale.jewel.supportClasses.datechooser.DateChooserTable; DateChooserTable;
         import org.apache.royale.jewel.beads.views.TableView; TableView;
 
+        import org.apache.royale.jewel.supportClasses.datechooser.DateChooserTable; DateChooserTable;
         import org.apache.royale.jewel.supportClasses.scrollbar.ScrollingViewport; ScrollingViewport;
         
         COMPILE::SWF
@@ -66,7 +67,7 @@ package
             import org.apache.royale.jewel.beads.views.RadioButtonView; RadioButtonView;
 		    import org.apache.royale.jewel.beads.views.CheckBoxView; CheckBoxView;
 
-            import org.apache.royale.jewel.beads.views.DropDownListView; DropDownListView;
+            // import org.apache.royale.jewel.beads.views.DropDownListView; DropDownListView;
             import org.apache.royale.jewel.beads.controllers.DropDownListController; DropDownListController;
         }
 
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 e529c6e..ff7e499 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
@@ -19,12 +19,16 @@
 package org.apache.royale.jewel
 {
     import org.apache.royale.core.ISelectionModel;
+    import org.apache.royale.core.IDataProviderModel;
+    import org.apache.royale.core.DataContainerBase;
+    import org.apache.royale.core.IListPresentationModel;
+    import org.apache.royale.jewel.beads.models.ListPresentationModel;
+    import org.apache.royale.html.elements.Select;
 
     COMPILE::JS
     {
         import goog.events;
         import org.apache.royale.core.WrappedHTMLElement;
-        import org.apache.royale.html.beads.models.ArraySelectionModel;
         import org.apache.royale.html.util.addElementToWrapper;
     }
 
@@ -62,7 +66,7 @@ package org.apache.royale.jewel
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.9.3
      */
-	public class DropDownList extends Button
+	public class DropDownList extends DataContainerBase
 	{
         /**
          *  Constructor.
@@ -74,28 +78,83 @@ package org.apache.royale.jewel
          */
 		public function DropDownList()
 		{
+            super();
             typeNames = "jewel dropdownlist";
-
-            COMPILE::JS
-            {
-                model = new ArraySelectionModel();
-            }
 		}
 
+        private var _prompt:String = "";
+
         /**
-         *  The data set to be displayed.  Usually a simple
-         *  array of strings.  A more complex component
-         *  would allow more complex data and data sets.
+         *  The prompt for the DropDownList control.
          *
          *  @langversion 3.0
          *  @playerversion Flash 10.2
          *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
-         *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
+         *  @productversion Royale 0.9
          */
+        public function get prompt():String
+        {
+            return _prompt;
+        }
+
+        public function set prompt(value:String):void
+        {
+            _prompt = value;
+        }
+
+        protected var _dropDown:Select;
+
+        public function get dropDown():Select
+        {
+            return _dropDown;
+        }
+
+        public function set dropDown(value:Select):void
+        {
+            _dropDown = value;
+        }
+
+        /**
+		 *  The name of field within the data used for display. Each item of the
+		 *  data should have a property with this name.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.3
+		 *  @royaleignorecoercion org.apache.royale.core.IDataProviderModel
+		 */
+		public function get labelField():String
+		{
+			return IDataProviderModel(model).labelField;
+		}
+		/**
+		 * @royaleignorecoercion org.apache.royale.core.IDataProviderModel
+		 */
+		public function set labelField(value:String):void
+		{
+            IDataProviderModel(model).labelField = value;
+		}
+
+        /**
+		 *  The data being display by the List.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.3
+		 *  @royaleignorecoercion org.apache.royale.core.IDataProviderModel
+		 */
         public function get dataProvider():Object
         {
-            return ISelectionModel(model).dataProvider;
+            return IDataProviderModel(model).dataProvider;
+        }
+		/**
+		 * @royaleignorecoercion org.apache.royale.core.IDataProviderModel
+		 */
+        public function set dataProvider(value:Object):void
+        {
+            IDataProviderModel(model).dataProvider = value;
         }
 
         /**
@@ -104,41 +163,44 @@ package org.apache.royale.jewel
          *  @royaleignorecoercion HTMLSelectElement
          *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
          */
-        public function set dataProvider(value:Object):void
-        {
-            ISelectionModel(model).dataProvider = value;
-            COMPILE::JS
-            {
-                var dp:HTMLOptionsCollection;
-                var i:int;
-                var n:int;
-                var opt:HTMLOptionElement;
-                var dd:HTMLSelectElement = element as HTMLSelectElement;
-
-                dp = dd.options;
-                n = dp.length;
-                for (i = 0; i < n; i++) {
-                    dd.remove(0);
-                }
-                // The value could be undefined if data binding is used and the variable is not initialized.
-                if(!value)return;
+        // public function set dataProvider(value:Object):void
+        // {
+        //     ISelectionModel(model).dataProvider = value;
+        //     COMPILE::JS
+        //     {
+        //         var dp:HTMLOptionsCollection;
+        //         var i:int;
+        //         var n:int;
+        //         var opt:HTMLOptionElement;
+        //         var dd:HTMLSelectElement = element as HTMLSelectElement;
+
+        //         dp = dd.options;
+        //         n = dp.length;
+        //         for (i = 0; i < n; i++) {
+        //             dd.remove(0);
+        //         }
+        //         // The value could be undefined if data binding is used and the variable is not initialized.
+        //         if(!value)return;
                 
-                var lf:String = labelField;
-                n = value.length;
-                for (i = 0; i < n; i++) {
-                    opt = document.createElement('option') as HTMLOptionElement;
-                    if (lf)
-                        opt.text = value[i][lf];
-                    else
-                        opt.text = value[i];
-                    dd.add(opt, null);
-                }
-
-            }
-        }
+        //         var lf:String = labelField;
+        //         n = value.length;
+        //         for (i = 0; i < n; i++) {
+        //             opt = document.createElement('option') as HTMLOptionElement;
+        //             if (lf)
+        //                 opt.text = value[i][lf];
+        //             else
+        //                 opt.text = value[i];
+        //             dd.add(opt, null);
+        //         }
+
+        //     }
+        // }
 
         [Bindable("change")]
         /**
+         *  The index of the currently selected item. Changing this value
+		 *  also changes the selectedItem property.
+         *  
          *  @copy org.apache.royale.core.ISelectionModel#selectedIndex
          *
          *  @langversion 3.0
@@ -160,15 +222,17 @@ package org.apache.royale.jewel
         public function set selectedIndex(value:int):void
         {
             ISelectionModel(model).selectedIndex = value;
-            COMPILE::JS
-            {
-                (element as HTMLSelectElement).selectedIndex = ISelectionModel(model).selectedIndex;
-            }
+            // COMPILE::JS
+            // {
+            //     (element as HTMLSelectElement).selectedIndex = ISelectionModel(model).selectedIndex;
+            // }
         }
 
-
         [Bindable("change")]
         /**
+         *  The item currently selected. Changing this value also
+		 *  changes the selectedIndex property.
+         * 
          *  @copy org.apache.royale.core.ISelectionModel#selectedItem
          *
          *  @langversion 3.0
@@ -190,33 +254,31 @@ 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;
-            }
+            // COMPILE::JS
+            // {
+            //     (element as HTMLSelectElement).selectedIndex = ISelectionModel(model).selectedIndex;
+            // }
         }
 
         /**
-         *  The name of field within the data used for display. Each item of the
-         *  data should have a property with this name.
-         *
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
-         *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
-         */
-        public function get labelField():String
-        {
-            return ISelectionModel(model).labelField;
-        }
-        /**
-         * @royaleignorecoercion org.apache.royale.core.ISelectionModel
-         */
-        public function set labelField(value:String):void
-        {
-            ISelectionModel(model).labelField = value;
-        }
+		 *  The presentation model for the list.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9.3
+		 *  @royaleignorecoercion org.apache.royale.core.IListPresentationModel
+		 */
+		public function get presentationModel():IListPresentationModel
+		{
+			var presModel:IListPresentationModel = getBeadByType(IListPresentationModel) as IListPresentationModel;
+			if (presModel == null) {
+				presModel = new ListPresentationModel();
+				addBead(presModel);
+			}
+			return presModel;
+		}
+        
 
         /**
          * @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
@@ -225,10 +287,11 @@ package org.apache.royale.jewel
         COMPILE::JS
         override protected function createElement():WrappedHTMLElement
         {
-			addElementToWrapper(this,'select');
+			addElementToWrapper(this, 'select');
             (element as HTMLSelectElement).size = 1;
-            goog.events.listen(element, 'change',
-                changeHandler);
+            
+            //goog.events.listen(element, 'change', changeHandler);
+            
             positioner = element;
             return element;
         }
@@ -236,10 +299,10 @@ package org.apache.royale.jewel
         /**
          * @royaleignorecoercion HTMLSelectElement
          */
-        COMPILE::JS
-        protected function changeHandler(event:Event):void
-        {
-            model.selectedIndex = (element as HTMLSelectElement).selectedIndex;
-        }
+        // COMPILE::JS
+        // protected function changeHandler(event:Event):void
+        // {
+        //     model.selectedIndex = (element as HTMLSelectElement).selectedIndex;
+        // }
     }
 }
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 2582856..75fcf47 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
@@ -18,288 +18,129 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.jewel.beads.views
 {
-	import flash.display.DisplayObjectContainer;
-	import flash.display.Graphics;
-	import flash.display.Shape;
-	import flash.display.SimpleButton;
-	import flash.display.Sprite;
-	import flash.text.TextFieldType;
-	
-	import org.apache.royale.core.BeadViewBase;
-	import org.apache.royale.core.CSSTextField;
-	import org.apache.royale.core.IBeadView;
-	import org.apache.royale.core.IChild;
-	import org.apache.royale.core.IPopUpHost;
-	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.utils.SolidBorderUtil;
-	import org.apache.royale.utils.UIUtils;
-    import org.apache.royale.html.beads.IDropDownListView;
-    
+    import org.apache.royale.core.ISelectionModel;
+    import org.apache.royale.core.IStrand;
+    import org.apache.royale.html.elements.Option;
+    import org.apache.royale.html.elements.Select;
+    import org.apache.royale.html.beads.DataContainerView;
+    import org.apache.royale.jewel.DropDownList;
+    import org.apache.royale.events.Event;
+
     /**
-     *  The DropDownListView class is the default view for
-     *  the org.apache.royale.html.DropDownList class.
-     *  It displays a simple text label with what appears to be a
-     *  down arrow button on the right, but really, the entire
-     *  view is the button that will display or dismiss the dropdown.
-     *  
-	 *  @viewbead
+     *  The DropDownListView class creates the visual elements of the org.apache.royale.jewel.DropDownList
+     *  component. The job of the view bead is to put together the parts of the DropDownList such as the Select and Label
+     *
+     *  @viewbead
      *  @langversion 3.0
      *  @playerversion Flash 10.2
      *  @playerversion AIR 2.6
-     *  @productversion Royale 0.9.3
+     *  @productversion Royale 0.8
      */
-	public class DropDownListView extends BeadViewBase implements IDropDownListView, IBeadView
-	{
-        /**
-         *  Constructor.
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
-         */
-		public function DropDownListView()
-		{
-            upSprite = new Sprite();
-            downSprite = new Sprite();
-            overSprite = new Sprite();
-			upTextField = new CSSTextField();
-			downTextField = new CSSTextField();
-			overTextField = new CSSTextField();
-            upSprite.addChild(upTextField);
-            overSprite.addChild(overTextField);
-            downSprite.addChild(downTextField);
-            upTextField.parentDrawsBackground = true;
-            downTextField.parentDrawsBackground = true;
-            overTextField.parentDrawsBackground = true;
-			upTextField.selectable = false;
-			upTextField.type = TextFieldType.DYNAMIC;
-			downTextField.selectable = false;
-			downTextField.type = TextFieldType.DYNAMIC;
-			overTextField.selectable = false;
-            overTextField.type = TextFieldType.DYNAMIC;
-            // auto-size collapses if no text
-			//upTextField.autoSize = "left";
-			//downTextField.autoSize = "left";
-			//overTextField.autoSize = "left";
-
-            upArrows = new Shape();
-            overArrows = new Shape();
-            downArrows = new Shape();
-            upSprite.addChild(upArrows);
-			overSprite.addChild(overArrows);
-			downSprite.addChild(downArrows);
-            drawArrows(upArrows);
-            drawArrows(overArrows);
-            drawArrows(downArrows);
-
-		}
+    public class DropDownListView extends DataContainerView
+    {
+        public function DropDownListView()
+        {
+            super();
+        }
 
-        
-		private var selectionModel:ISelectionModel;
-		
-		private var shape:Shape;
-		
         /**
          *  @copy org.apache.royale.core.IBead#strand
-         *  
+         *
+         *  @royaleignorecoercion HTMLLabelElement
+         *
          *  @langversion 3.0
          *  @playerversion Flash 10.2
          *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
+         *  @productversion Royale 0.8
          */
-		override public function set strand(value:IStrand):void
-		{
-			super.strand = value;
-            selectionModel = value.getBeadByType(ISelectionModel) as ISelectionModel;
-            selectionModel.addEventListener("selectedIndexChanged", selectionChangeHandler);
-            selectionModel.addEventListener("dataProviderChanged", selectionChangeHandler);
-			shape = new Shape();
-			shape.graphics.beginFill(0xCCCCCC);
-			shape.graphics.drawRect(0, 0, 10, 10);
-			shape.graphics.endFill();
-            upTextField.styleParent = _strand;
-            downTextField.styleParent = _strand;
-            overTextField.styleParent = _strand;
-            var button:SimpleButton = value as SimpleButton;
-			button.upState = upSprite;
-            button.downState = downSprite;
-            button.overState = overSprite;
-            button.hitTestState = shape;
-			if (selectionModel.selectedIndex !== -1)
-				text = selectionModel.selectedItem.toString();
-            else
-                text = "^W_";
-            upTextField.height = upTextField.textHeight + 4;
-            downTextField.height = downTextField.textHeight + 4;
-            overTextField.height = overTextField.textHeight + 4;
-            if (selectionModel.selectedIndex == -1)
-                text = "";
-            
-            IEventDispatcher(value).addEventListener("heightChanged", changeHandler);
-            IEventDispatcher(value).addEventListener("widthChanged", changeHandler);
-			changeHandler(null);
-		}
-		
-		private function selectionChangeHandler(event:Event):void
-		{
-            if (selectionModel.selectedItem == null)
-                text = "";
-            else if (selectionModel.labelField != null)
-                text = selectionModel.selectedItem[selectionModel.labelField].toString();
-            else
-                text = selectionModel.selectedItem.toString();
-		}
-		
-        private function changeHandler(event:Event):void
+        override public function set strand(value:IStrand):void
         {
-            var ww:Number = IUIBase(_strand).width;
-            var hh:Number = IUIBase(_strand).height;
-            
-            upArrows.x = ww - upArrows.width - 6;            
-            overArrows.x = ww - overArrows.width - 6;            
-            downArrows.x = ww - downArrows.width - 6;
-            upArrows.y = (hh - upArrows.height) / 2;            
-            overArrows.y = (hh - overArrows.height) / 2;            
-            downArrows.y = (hh - downArrows.height) / 2;
+            super.strand = value;
 
-			upTextField.width = upArrows.x;
-			downTextField.width = downArrows.x;
-			overTextField.width = overArrows.x;
-			upTextField.height = hh;
-			downTextField.height = hh;
-			overTextField.height = hh;
-            
-            drawBorder(upSprite, 0xf8f8f8, ww, hh);
-            drawBorder(overSprite, 0xe8e8e8, ww, hh);
-            drawBorder(downSprite, 0xd8d8d8, ww, hh);
-            
-			shape.graphics.clear();
-			shape.graphics.beginFill(0xCCCCCC);
-			shape.graphics.drawRect(0, 0, ww, hh);
-			shape.graphics.endFill();
+            COMPILE::JS
+            {
+                var dropDownList:DropDownList = (value as DropDownList);
+
+                // dropDownList.labelDisplay = document.createElement('label') as HTMLLabelElement;
+                // dropDownList.labelDisplay.innerText = dropDownList.prompt;
+                // dropDownList.labelDisplay.classList.add("mdl-textfield__label");
+
+                dropDownList.dropDown = new Select();
+                // dropDownList.dropDown.className = "mdl-textfield__input";
+
+                var emptyOption:Option = new Option();
+                // emptyOption.element.style.display = "none";
+
+                dropDownList.dropDown.addElement(emptyOption);
+                
+                setNameForDropDownList();
+
+                // dropDownList.element.appendChild(dropDownList.labelDisplay);
+                dropDownList.addElement(dropDownList.dropDown);
+            }
         }
-        
-		private var upTextField:CSSTextField;
-		private var downTextField:CSSTextField;
-		private var overTextField:CSSTextField;
-        private var upSprite:Sprite;
-        private var downSprite:Sprite;
-        private var overSprite:Sprite;
-        private var upArrows:Shape;
-        private var downArrows:Shape;
-        private var overArrows:Shape;
-		
-        private function drawBorder(sprite:Sprite, color:uint, ww:Number, hh:Number):void
+
+        override protected function dataProviderChangeHandler(event:Event):void
         {
-			sprite.graphics.clear();
-            SolidBorderUtil.drawBorder(sprite.graphics, 0, 0,
-                ww, hh,
-                0x808080, color, 1, 1, 4);
+            super.dataProviderChangeHandler(event);
+
+            COMPILE::JS
+            {
+                setProgrammaticallyChangedSelection();
+            }
         }
-        
-        private function drawArrows(shape:Shape):void
+
+        override protected function itemsCreatedHandler(event:org.apache.royale.events.Event):void
         {
-            var g:Graphics = shape.graphics;
-            g.beginFill(0);
-            g.moveTo(8, 0);
-            g.lineTo(12, 4);
-            g.lineTo(4, 4);
-            g.lineTo(8, 0);
-            g.endFill();
-            g.beginFill(0);
-            g.moveTo(8, 10);
-            g.lineTo(12, 6);
-            g.lineTo(4, 6);
-            g.lineTo(8, 10);
-            g.endFill();
+            super.itemsCreatedHandler(event);
+
+            COMPILE::JS
+            {
+                setProgrammaticallyChangedSelection();
+            }
         }
-            
-       /**
-         *  The text that is displayed in the view.
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
-         */
-		public function get text():String
-		{
-			return upTextField.text;
-		}
-        
-        /**
-         *  @private
-         */
-		public function set text(value:String):void
-		{
-			upTextField.text = value;
-			downTextField.text = value;
-			overTextField.text = value;
-		}
-		
-        private var _popUp:IStrand;
-        
-        /**
-         *  The dropdown/popup that displays the set of choices.
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
-         */
-        public function get popUp():IStrand
+
+        private function selectionChangeHandler(event:Event):void
         {
-            if (!_popUp)
+            COMPILE::JS
             {
-                var popUpClass:Class = ValuesManager.valuesImpl.getValue(_strand, "iPopUp") as Class;
-                _popUp = new popUpClass() as IStrand;
+                setProgrammaticallyChangedSelection();
             }
-            return _popUp;
         }
-        
-        private var _popUpVisible:Boolean;
-        
-        /**
-         *  A flag that indicates whether the dropdown/popup is
-         *  visible.
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.3
-         */
-        public function get popUpVisible():Boolean
+
+        override protected function handleInitComplete(event:Event):void
         {
-            return _popUpVisible;
+            super.handleInitComplete(event);
+            
+            dataModel.addEventListener("selectedIndexChanged", selectionChangeHandler);
+
+            // COMPILE::JS
+            // {
+            //     host.element.classList.add("DropDownList");
+            // }
         }
-        
-        /**
-         *  @private
-         */
-        public function set popUpVisible(value:Boolean):void
+
+        COMPILE::JS
+        private function setNameForDropDownList():void
         {
-            var host:IPopUpHost;
-            if (value != _popUpVisible)
+            var dropDownList:DropDownList = (_strand as DropDownList);
+
+            var name:String = "dropDownList" + Math.random();
+            // dropDownList.labelDisplay.htmlFor = name;
+            dropDownList.dropDown.element.name = name;
+        }
+
+        COMPILE::JS
+        private function setProgrammaticallyChangedSelection():void
+        {
+            var dropDownList:DropDownList = (_strand as DropDownList);
+            var selectedIndex:int = dropDownList.dropDown.element["selectedIndex"] - 1;
+            var model:ISelectionModel = dataModel as ISelectionModel;
+
+            if (model.selectedIndex > -1 && model.dataProvider && model.selectedIndex != selectedIndex)
             {
-                _popUpVisible = value;
-                if (value)
-                {
-					host = UIUtils.findPopUpHost(_strand as IUIBase);
-                    IPopUpHost(host).popUpParent.addElement(popUp as IChild);
-                }
-                else
-                {
-                    host = UIUtils.findPopUpHost(_strand as IUIBase);
-                    IPopUpHost(host).popUpParent.removeElement(popUp as IChild);
-                }
+                dropDownList.dropDown.element["selectedIndex"] = model.selectedIndex + 1;
             }
         }
-        
-	}
+    }
 }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/DropDownListItemRenderer.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/DropDownListItemRenderer.as
new file mode 100644
index 0000000..251ffb7
--- /dev/null
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/itemRenderers/DropDownListItemRenderer.as
@@ -0,0 +1,104 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.jewel.itemRenderers
+{
+    import org.apache.royale.html.elements.Option;
+    import org.apache.royale.html.supportClasses.MXMLItemRenderer;
+
+    COMPILE::JS
+    {
+        import org.apache.royale.core.WrappedHTMLElement;            
+    }
+	
+    /**
+     *  The DropDownListItemRenderer class creates a DropDownList menu item
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9.3
+     */    
+	public class DropDownListItemRenderer extends MXMLItemRenderer
+	{
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.3
+         */
+		public function DropDownListItemRenderer()
+		{
+			super();
+
+            //className = ""; //set to empty string avoid 'undefined' output when no class selector is assigned by user;
+        }
+
+        private var item:Option;
+
+        /**
+         *  Sets the data value and uses the String version of the data for display.
+         *
+         *  @param Object data The object being displayed by the itemRenderer instance.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.3
+         */
+        override public function set data(value:Object):void
+        {
+            super.data = value;
+
+            if (labelField)
+            {
+                item.text = String(value[labelField]);
+            }
+            else
+            {
+                item.text = String(value);
+            }
+
+            COMPILE::JS
+            {
+                if (dataField)
+                {
+                    item.element["value"] = String(value[dataField]);
+                }
+                else
+                {
+                    item.element["value"] = String(value);
+                }
+            }
+        }
+
+        /**
+         * @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
+         */
+        COMPILE::JS
+        override protected function createElement():WrappedHTMLElement
+        {
+            item = new Option();
+
+            element = item.element as WrappedHTMLElement;
+            return element;
+        }
+	}
+}
diff --git a/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass b/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass
index 451434f..af06064 100644
--- a/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass
+++ b/frameworks/projects/Jewel/src/main/sass/components/_dropdownlist.sass
@@ -20,11 +20,21 @@
 // Jewel DropDownList
 
 // DropDownList variables
+j|DropDownList
+    IBeadView: ClassReference("org.apache.royale.jewel.beads.views.DropDownListView")
+    IBeadModel: ClassReference("org.apache.royale.jewel.beads.models.ArrayListSelectionModel")
+    IDataProviderItemRendererMapper: ClassReference("org.apache.royale.jewel.beads.itemRenderers.DataItemRendererFactoryForCollectionView")
+    IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory")
+    IItemRenderer: ClassReference("org.apache.royale.jewel.itemRenderers.DropDownListItemRenderer")
+    // IBeadController: ClassReference("org.apache.royale.mdl.beads.controllers.DropDownListController")
+
+    // IBeadModel: ClassReference("org.apache.royale.mdl.beads.models.DropDownListModel");
+    // IBeadLayout: ClassReference(null);
+    // IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForArrayData");
 
 @media -royale-swf	
     j|DropDownList
-        IBeadModel: ClassReference("org.apache.royale.html.beads.models.ArraySelectionModel")
-        IBeadView: ClassReference("org.apache.royale.jewel.beads.views.DropDownListView")
+        IBeadModel: ClassReference("org.apache.royale.jewel.beads.models.ArrayListSelectionModel")
         IBeadController: ClassReference("org.apache.royale.jewel.beads.controllers.DropDownListController")
         IPopUp: ClassReference("org.apache.royale.jewel.supportClasses.dropdownlist.DropDownListList")
         // font-size: 11px