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

[royale-asjs] branch develop updated: Tuning to the model hierarchy for List/Combo/DropDown - aiming for consistent behaviour

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

gregdove 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 1a175e8  Tuning to the model hierarchy for List/Combo/DropDown - aiming for consistent behaviour
1a175e8 is described below

commit 1a175e88be91a6ee2a4e6d8dd13167c1cb621456
Author: greg-dove <gr...@gmail.com>
AuthorDate: Thu Nov 8 22:06:34 2018 +1300

    Tuning to the model hierarchy for List/Combo/DropDown - aiming for consistent behaviour
---
 .../src/main/royale/ComboBoxPlayGround.mxml        |  35 +++---
 .../src/main/royale/ListPlayGround.mxml            |  12 +-
 .../royale/org/apache/royale/jewel/ComboBox.as     |  41 ++++--
 .../royale/org/apache/royale/jewel/DropDownList.as |   4 +-
 .../main/royale/org/apache/royale/jewel/List.as    |  24 ++++
 .../jewel/beads/models/ArrayListSelectionModel.as  |  97 ++++++++++----
 .../royale/jewel/beads/models/DropDownListModel.as | 140 ---------------------
 .../jewel/beads/models/IDropDownListModel.as       |   2 +-
 ...ropDownListModel.as => IJewelSelectionModel.as} |  11 +-
 9 files changed, 164 insertions(+), 202 deletions(-)

diff --git a/examples/royale/JewelExample/src/main/royale/ComboBoxPlayGround.mxml b/examples/royale/JewelExample/src/main/royale/ComboBoxPlayGround.mxml
index bb45b22..0983454 100644
--- a/examples/royale/JewelExample/src/main/royale/ComboBoxPlayGround.mxml
+++ b/examples/royale/JewelExample/src/main/royale/ComboBoxPlayGround.mxml
@@ -22,19 +22,19 @@ limitations under the License.
 				  xmlns:js="library://ns.apache.org/royale/basic"
 				  xmlns:html="library://ns.apache.org/royale/html"
 				  xmlns:models="models.*">
-    
+
 	<fx:Script>
 		<![CDATA[
 			import vos.IconListVO;
 			import org.apache.royale.collections.ArrayList;
 
-            private function watchmenComboBoxSelectedItem(event:Event):void {
+           /* private function watchmenComboBoxSelectedItem(event:Event):void {
 				watchmenComboBoxResult.html = "<strong>ComboBox selectedItem:</strong> " + event.target.selectedItem;
-            }
-            
-            private function avengersComboBoxSelectedItem(event:Event):void {
+            }*/
+
+            /*private function avengersComboBoxSelectedItem(event:Event):void {
 				avengersComboBoxResult.html = "<strong>ComboBox selectedItem:</strong> " + event.target.selectedItem.label;
-            }
+            }*/
 
 			private function onValueChange(event:Event):void
 			{
@@ -47,7 +47,7 @@ limitations under the License.
 			}
 
 			private function describeItem(item:*):String {
-				const intro:String = "<strong>DropDownList selectedItem:</strong> ";
+				const intro:String = "<strong>ComboBox selectedItem:</strong> ";
 				var evaluated:String;
 				if (item is String) {
 					evaluated = 'String value: \'' + item + '\'';
@@ -75,9 +75,9 @@ limitations under the License.
 	<j:model>
         <models:ListsModel id="listModel"/>
 	</j:model>
-	
+
 	<j:Grid gap="true" itemsVerticalAlign="itemsSameHeight">
-		
+
 		<j:GridCell desktopNumerator="1" desktopDenominator="1"
 					tabletNumerator="1" tabletDenominator="1"
 					phoneNumerator="1" phoneDenominator="1">
@@ -90,7 +90,7 @@ limitations under the License.
 								tabletNumerator="1" tabletDenominator="3"
 								phoneNumerator="1" phoneDenominator="1"
 								itemsVerticalAlign="itemsCentered" width="290">
-						<j:ComboBox id="watchmenComboBox" dataProvider="{listModel.watchmen}" change="watchmenComboBoxSelectedItem(event)">
+						<j:ComboBox id="watchmenComboBox" dataProvider="{listModel.watchmen}">
 							<j:beads>
 								<j:ComboBoxTextPrompt prompt="Watchmen Team..."/>
 							</j:beads>
@@ -110,7 +110,7 @@ limitations under the License.
 								tabletNumerator="1" tabletDenominator="3"
 								phoneNumerator="1" phoneDenominator="1"
 								itemsVerticalAlign="itemsCentered" width="290">
-						<j:Label id="watchmenComboBoxResult" html="&lt;strong>ComboBox selectedItem:&lt;/strong> "/>
+						<j:Label id="watchmenComboBoxResult" html="{describeItem(watchmenComboBox.selectedItem)}"/>
 					</j:GridCell>
 				</j:Grid>
 			</j:Card>
@@ -127,7 +127,8 @@ limitations under the License.
 								tabletNumerator="1" tabletDenominator="3"
 								phoneNumerator="1" phoneDenominator="1"
 								itemsVerticalAlign="itemsCentered" width="290">
-						<j:ComboBox id="avengersComboBox" width="140" labelField="label" dataProvider="{listModel.avengers}" change="avengersComboBoxSelectedItem(event)">
+						<j:ComboBox id="avengersComboBox" width="140" labelField="label"
+									dataProvider="{listModel.avengers}">
 							<j:beads>
 								<j:ComboBoxTextPrompt prompt="Avengers Team..."/>
 							</j:beads>
@@ -146,7 +147,7 @@ limitations under the License.
 								tabletNumerator="1" tabletDenominator="3"
 								phoneNumerator="1" phoneDenominator="1"
 								itemsVerticalAlign="itemsCentered" width="290">
-						<j:Label id="avengersComboBoxResult" html="&lt;strong>ComboBox selectedItem:&lt;/strong> "/>
+						<j:Label id="avengersComboBoxResult" html="{describeItem(avengersComboBox.selectedItem)}"/>
 					</j:GridCell>
 				</j:Grid>
 			</j:Card>
@@ -154,7 +155,7 @@ limitations under the License.
 	</j:Grid>
 
 	<j:Grid gap="true" itemsVerticalAlign="itemsSameHeight">
-		
+
 		<j:GridCell desktopNumerator="1" desktopDenominator="1"
 					tabletNumerator="1" tabletDenominator="1"
 					phoneNumerator="1" phoneDenominator="1">
@@ -166,12 +167,12 @@ limitations under the License.
 					<j:ComboBox id="cmb" labelField="label" dataProvider="{listModel.avengers}"/>
 					<j:Label text="Width: {cmb.width}px"/>
 				</j:HGroup>
-				
+
 				<j:Slider id="slider_w" width="250" value="200" minimum="100" maximum="400" valueChange="onValueChange(event)"/>
 
 			</j:Card>
 		</j:GridCell>
-	
+
 	</j:Grid>
 
 	<j:Grid gap="true" itemsVerticalAlign="itemsSameHeight">
@@ -187,7 +188,7 @@ limitations under the License.
 			</j:Card>
 		</j:GridCell>
 	</j:Grid>
-	
+
 	<j:Grid gap="true" itemsVerticalAlign="itemsSameHeight">
 		<j:GridCell desktopNumerator="1" desktopDenominator="1"
 					tabletNumerator="1" tabletDenominator="1"
diff --git a/examples/royale/JewelExample/src/main/royale/ListPlayGround.mxml b/examples/royale/JewelExample/src/main/royale/ListPlayGround.mxml
index c00692e..baad8a6 100644
--- a/examples/royale/JewelExample/src/main/royale/ListPlayGround.mxml
+++ b/examples/royale/JewelExample/src/main/royale/ListPlayGround.mxml
@@ -22,7 +22,7 @@ limitations under the License.
 		xmlns:js="library://ns.apache.org/royale/basic"
 		xmlns:html="library://ns.apache.org/royale/html"
 		xmlns:models="models.*">
-    
+
     <fx:Script>
 		<![CDATA[
 			import org.apache.royale.collections.ArrayList;
@@ -57,14 +57,14 @@ limitations under the License.
 					new IconListVO("Label", "label"),
 					new IconListVO("RadioButton", "radio_button_checked"),
 					new IconListVO("Text", "subject"),
-					new IconListVO("TextInput", "text_fields")            
+					new IconListVO("TextInput", "text_fields")
 				]);
 			}
 
 			private function addItem():void
 			{
 				var iconListVO:IconListVO = new IconListVO("New Item", MaterialIconType.CLOSE);
-				
+
 				(iconList.dataProvider as ArrayList).addItem(iconListVO);
 				// listModel.iconListData.addItem(iconListVO); // to test things are adding to right place
 			}
@@ -91,7 +91,7 @@ limitations under the License.
 			}
 
 			private function describeItem(item:*):String {
-				const intro:String = "<strong>DropDownList selectedItem:</strong> ";
+				const intro:String = "<strong>List selectedItem:</strong> ";
 				var evaluated:String;
 				if (item is String) {
 					evaluated = 'String value: \'' + item + '\'';
@@ -191,8 +191,8 @@ limitations under the License.
 					phoneNumerator="1" phoneDenominator="1">
 			<j:Card>
 				<html:H3 text="Jewel List (Horizontal)"/>
-				<j:List id="alist" percentWidth="100" height="100">  
-				<j:beads>  
+				<j:List id="alist" percentWidth="100" height="100">
+				<j:beads>
 					<j:HorizontalLayout itemsExpand="true" />
 				</j:beads>
 				<j:dataProvider>
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as
index d639b3f..f9f704b 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as
@@ -23,8 +23,11 @@ package org.apache.royale.jewel
 	import org.apache.royale.core.ISelectionModel;
 	import org.apache.royale.core.IDataProviderModel;
 	import org.apache.royale.core.IListPresentationModel;
+	import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
 	import org.apache.royale.jewel.beads.models.ListPresentationModel;
-	
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.Event;
+
 	//--------------------------------------
     //  Events
     //--------------------------------------
@@ -39,18 +42,18 @@ package org.apache.royale.jewel
      *  @productversion Royale 0.9.4
      */
 	[Event(name="change", type="org.apache.royale.events.Event")]
-	
+
 	/**
 	 *  The ComboBox class is a component that displays an input field and
 	 *  pop-up List with selections. Selecting an item from the pop-up List
 	 *  places that item into the input field of the ComboBox. The ComboBox
 	 *  uses the following bead types:
-	 * 
+	 *
 	 *  org.apache.royale.core.IBeadModel: the data model, which includes the dataProvider, selectedItem, and
 	 *  so forth.
 	 *  org.apache.royale.core.IBeadView:  the bead that constructs the visual parts of the component.
 	 *  org.apache.royale.core.IBeadController: the bead that handles input and output.
-	 * 
+	 *
 	 *  @langversion 3.0
 	 *  @playerversion Flash 10.2
 	 *  @playerversion AIR 2.6
@@ -69,8 +72,9 @@ package org.apache.royale.jewel
 		public function ComboBox()
 		{
 			super();
-            
+
             typeNames = "jewel combobox";
+            addEventListener('beadsAdded', setupModelChangeListener);
 		}
 
 		/**
@@ -94,7 +98,7 @@ package org.apache.royale.jewel
 		{
             IDataProviderModel(model).labelField = value;
 		}
-		
+
 		/**
 		 *  The data for display by the ComboBox.
 		 *
@@ -115,7 +119,7 @@ package org.apache.royale.jewel
 		{
 			IDataProviderModel(model).dataProvider = value;
 		}
-		
+
         [Bindable("change")]
 		/**
 		 *  The index of the currently selected item. Changing this item changes
@@ -138,7 +142,7 @@ package org.apache.royale.jewel
 		{
 			ISelectionModel(model).selectedIndex = value;
 		}
-		
+
         [Bindable("change")]
 		/**
 		 *  The item currently selected. Changing this value also
@@ -158,7 +162,7 @@ package org.apache.royale.jewel
 		{
 			ISelectionModel(model).selectedItem = value;
 		}
-		
+
 		/**
 		 *  The presentation model for the list.
 		 *
@@ -177,5 +181,24 @@ package org.apache.royale.jewel
 			}
 			return presModel;
 		}
+
+        /**
+         * @royaleignorecoercion org.apache.royale.events.IEventDispatcher;
+		 * @royaleignorecoercion org.apache.royale.jewel.beads.models.IJewelSelectionModel;
+         */
+        private function setupModelChangeListener():void{
+            removeEventListener('beadsAdded', setupModelChangeListener);
+            IEventDispatcher(model).addEventListener('change', modelChangeDispatcher);
+            IJewelSelectionModel(model).dispatchChangeOnDataProviderChange = true;
+        }
+
+        private var respondingToProgrammaticChange:Boolean;
+
+        private function modelChangeDispatcher(event:Event):void{
+            //handles re-dispatching for programmatic changes
+            respondingToProgrammaticChange = true;
+            dispatchEvent(new Event("change"));
+            respondingToProgrammaticChange = false;
+        }
 	}
 }
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 393edd1..597fe4f 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
@@ -316,13 +316,13 @@ package org.apache.royale.jewel
             var ddModel:IDropDownListModel = model as IDropDownListModel;
             if (ddModel) {
                 index -= ddModel.offset;
-                ddModel.processingInteractiveChange = true;
+                ddModel.setProcessingInteractiveChange(true);
             }
 
             model.selectedIndex = index;
 
             if (ddModel)
-                ddModel.processingInteractiveChange = false;
+                ddModel.setProcessingInteractiveChange(false);
         }
     }
 }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as
index a59e5ee..11091c7 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as
@@ -24,6 +24,9 @@ package org.apache.royale.jewel
 	import org.apache.royale.core.IDataProviderModel;
 	import org.apache.royale.core.IListPresentationModel;
 	import org.apache.royale.jewel.beads.models.ListPresentationModel;
+	import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.Event;
 
 	COMPILE::JS
 	{
@@ -82,6 +85,7 @@ package org.apache.royale.jewel
 		{
 			super();
             typeNames = "jewel list";
+            addEventListener('initComplete', setupModelChangeListener);
 		}
 
 		/**
@@ -229,5 +233,25 @@ package org.apache.royale.jewel
 			}
 			return presModel;
 		}
+
+
+        /**
+         * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+		 * @royaleignorecoercion org.apache.royale.jewel.beads.models.IJewelSelectionModel
+         */
+        private function setupModelChangeListener(event:Event):void{
+            removeEventListener('initComplete', setupModelChangeListener);
+            IEventDispatcher(model).addEventListener('change', modelChangeDispatcher);
+			IJewelSelectionModel(model).dispatchChangeOnDataProviderChange = true;
+        }
+
+        private var respondingToProgrammaticChange:Boolean;
+
+        private function modelChangeDispatcher(event:Event):void{
+            //handles re-dispatching for programmatic changes
+            respondingToProgrammaticChange = true;
+            dispatchEvent(new Event("change"));
+            respondingToProgrammaticChange = false;
+        }
    	}
 }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ArrayListSelectionModel.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ArrayListSelectionModel.as
index 38f3696..a735000 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ArrayListSelectionModel.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ArrayListSelectionModel.as
@@ -35,7 +35,7 @@ package org.apache.royale.jewel.beads.models
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.9.4
      */
-	public class ArrayListSelectionModel extends EventDispatcher implements ISelectionModel, IRollOverModel
+	public class ArrayListSelectionModel extends EventDispatcher implements IJewelSelectionModel, IRollOverModel
 	{
         /**
          *  Constructor.
@@ -49,6 +49,11 @@ package org.apache.royale.jewel.beads.models
 		{
 		}
 
+		private var _dispatchChangeOnDataChange:Boolean;
+		public function set dispatchChangeOnDataProviderChange(value:Boolean):void{
+            _dispatchChangeOnDataChange = true;
+		}
+
 		private var _strand:IStrand;
 
         /**
@@ -64,6 +69,14 @@ package org.apache.royale.jewel.beads.models
 			_strand = value;
 		}
 
+        private var _processingInteractiveChange:Boolean = false;
+        public function setProcessingInteractiveChange(value:Boolean):void{
+            _processingInteractiveChange = value;
+        }
+        protected function get processingInteractiveChange():Boolean{
+			return _processingInteractiveChange;
+		}
+
 		private var _dataProvider:IArrayList;
 
 		[Bindable("dataProviderChanged")]
@@ -88,12 +101,39 @@ package org.apache.royale.jewel.beads.models
             if (value == _dataProvider) return;
 
             _dataProvider = value as IArrayList;
-			if(!_dataProvider || _selectedIndex >= _dataProvider.length)
-				_selectedIndex = -1;
-            
-			_selectedItem = _selectedIndex == -1 ? null : _dataProvider.getItemAt(_selectedIndex);
-			
-			dispatchEvent(new Event("dataProviderChanged"));
+            var itemChanged:Boolean;
+            const oldIndex:int = _selectedIndex;
+            if (_dataProvider) {
+                if (_selectedItem) {
+                    _selectedIndex = _dataProvider.getItemIndex(_selectedItem);
+
+                    if (_selectedIndex == -1) {
+                        _selectedItem = null;
+                        itemChanged = true;
+                    }
+                } else {
+                    if (_selectedIndex != -1) {
+                        if (_selectedIndex < _dataProvider.length) {
+                            _selectedItem = _dataProvider.getItemAt(_selectedIndex);
+                            itemChanged = true;
+                        } else {
+                            _selectedIndex = -1;
+                        }
+                    }
+                }
+            } else {
+                itemChanged = _selectedItem != null;
+                _selectedItem = null;
+                _selectedIndex = -1;
+            }
+
+            dispatchEvent(new Event("dataProviderChanged"));
+            if (itemChanged)
+                dispatchEvent(new Event("selectedItemChanged"));
+            if (oldIndex != _selectedIndex)
+                dispatchEvent(new Event("selectedIndexChanged"));
+			if (_dispatchChangeOnDataChange && (itemChanged || oldIndex != _selectedIndex))
+                dispatchEvent(new Event("change"));
 		}
 
 		private var _selectedIndex:int = -1;
@@ -142,11 +182,26 @@ package org.apache.royale.jewel.beads.models
          */
 		public function set selectedIndex(value:int):void
 		{
+            if (!_dataProvider) {
+                _selectedIndex = value;
+                return;
+            }
             if (value == _selectedIndex) return;
 
-			_selectedIndex = value;
-			_selectedItem = (value == -1 || _dataProvider == null) ? null : (value < _dataProvider.length) ? _dataProvider.getItemAt(value) : null;
-			dispatchEvent(new Event("selectedIndexChanged"));
+            const oldItem:Object = _selectedItem;
+            _selectedIndex = value < _dataProvider.length ? value : _dataProvider.length - 1;
+            if (_selectedIndex != -1) {
+                _selectedItem = _dataProvider.getItemAt(_selectedIndex);
+            } else {
+                _selectedItem = null;
+            }
+
+            if ( oldItem != _selectedItem)
+                dispatchEvent(new Event("selectedItemChanged"));
+            dispatchEvent(new Event("selectedIndexChanged"));
+            if (!_processingInteractiveChange) {
+                dispatchEvent(new Event("change"));
+            }
 		}
 
         /**
@@ -194,19 +249,17 @@ package org.apache.royale.jewel.beads.models
 		public function set selectedItem(value:Object):void
 		{
             if (value == _selectedItem) return;
+            _selectedItem = value;
+            if (_dataProvider) {
+                const indexChanged:Boolean = _selectedIndex != (_selectedIndex = _dataProvider.getItemIndex(value));
 
-			_selectedItem = value;
-			var n:int = _dataProvider.length;
-			for (var i:int = 0; i < n; i++)
-			{
-				if (_dataProvider.getItemAt(i) == value)
-				{
-					_selectedIndex = i;
-					break;
-				}
-			}
-			dispatchEvent(new Event("selectedItemChanged"));
-			dispatchEvent(new Event("selectedIndexChanged"));
+                dispatchEvent(new Event("selectedItemChanged"));
+                if (indexChanged)
+                    dispatchEvent(new Event("selectedIndexChanged"));
+                if (!_processingInteractiveChange) {
+                    dispatchEvent(new Event("change"));
+                }
+            }
 		}
 
 		private var _selectedString:String;
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 d1b8d0f..bbb9422 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
@@ -18,8 +18,6 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.jewel.beads.models
 {
-    import org.apache.royale.collections.IArrayList;
-    import org.apache.royale.events.Event;
 
     /**
      *  The DropDownListModel class defines the data associated with an org.apache.royale.jewel.DropDownListModel
@@ -43,143 +41,5 @@ package org.apache.royale.jewel.beads.models
             return _offset;
         }
 
-        private var _processingInteractiveChange:Boolean = false;
-        public function set processingInteractiveChange(value:Boolean):void{
-            _processingInteractiveChange = value;
-        }
-
-
-        private var _dataProvider:IArrayList;
-
-		[Bindable("dataProviderChanged")]
-        /**
-         *  @copy org.apache.royale.core.ISelectionModel#dataProvider
-         *
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.4
-         */
-		override public function get dataProvider():Object
-		{
-			return _dataProvider;
-		}
-
-        /**
-         *  @private
-         */
-		override public function set dataProvider(value:Object):void
-		{
-            if (value == _dataProvider) return;
-            _dataProvider = value as IArrayList;
-            var itemChanged:Boolean;
-            const oldIndex:int = _selectedIndex;
-            if (_dataProvider) {
-                if (_selectedItem) {
-                    _selectedIndex = _dataProvider.getItemIndex(_selectedItem);
-
-                    if (_selectedIndex == -1) {
-                        _selectedItem = null;
-                        itemChanged = true;
-                    }
-                } else {
-                    if (_selectedIndex != -1) {
-                        if (_selectedIndex < _dataProvider.length) {
-                            _selectedItem = _dataProvider.getItemAt(_selectedIndex);
-                            itemChanged = true;
-                        } else {
-                            _selectedIndex = -1;
-                        }
-                    }
-                }
-            } else {
-				itemChanged = _selectedItem != null;
-                _selectedItem = null;
-				_selectedIndex = -1;
-			}
-
-            dispatchEvent(new Event("dataProviderChanged"));
-            if (itemChanged)
-                dispatchEvent(new Event("selectedItemChanged"));
-            if (oldIndex != _selectedIndex)
-                dispatchEvent(new Event("selectedIndexChanged"));
-		}
-
-		private var _selectedIndex:int = -1;
-
-        /**
-         *  @copy org.apache.royale.core.ISelectionModel#selectedIndex
-         *
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.4
-         */
-		override public function get selectedIndex():int
-		{
-			return _selectedIndex;
-		}
-
-        /**
-         *  @private
-         */
-		override public function set selectedIndex(value:int):void
-		{
-
-            if (!_dataProvider) {
-                _selectedIndex = value;
-                return;
-            }
-            if (value == _selectedIndex) return;
-
-            const oldItem:Object = _selectedItem;
-            _selectedIndex = value < _dataProvider.length ? value : _dataProvider.length - 1;
-            if (_selectedIndex != -1) {
-                _selectedItem = _dataProvider.getItemAt(_selectedIndex);
-            } else {
-                _selectedItem = null;
-            }
-
-			if ( oldItem != _selectedItem)
-                dispatchEvent(new Event("selectedItemChanged"));
-            dispatchEvent(new Event("selectedIndexChanged"));
-            if (!_processingInteractiveChange) {
-                dispatchEvent(new Event("change"));
-            }
-		}
-
-        private var _selectedItem:Object;
-
-        /**
-         *  @copy org.apache.royale.core.ISelectionModel#selectedItem
-         *
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.9.4
-         */
-		override public function get selectedItem():Object
-		{
-			return _selectedItem;
-		}
-
-        /**
-         *  @private
-         */
-		override public function set selectedItem(value:Object):void
-		{
-            if (value == _selectedItem) return;
-            _selectedItem = value;
-            if (_dataProvider) {
-                const indexChanged:Boolean = _selectedIndex != (_selectedIndex = _dataProvider.getItemIndex(value));
-
-                dispatchEvent(new Event("selectedItemChanged"));
-                if (indexChanged)
-                    dispatchEvent(new Event("selectedIndexChanged"));
-                if (!_processingInteractiveChange) {
-                    dispatchEvent(new Event("change"));
-                }
-            }
-		}
     }
 }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as
index dce03ef..43c75b3 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as
@@ -30,6 +30,6 @@ package org.apache.royale.jewel.beads.models
     {
 
         function get offset():int;
-        function set processingInteractiveChange(value:Boolean):void;
+        function setProcessingInteractiveChange(value:Boolean):void;
     }
 }
diff --git a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
similarity index 80%
copy from frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as
copy to frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
index dce03ef..62903df 100644
--- a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IDropDownListModel.as
+++ b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
@@ -18,18 +18,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.jewel.beads.models
 {
+
+    import org.apache.royale.core.ISelectionModel;
+
     /**
-     *  The IDropDownListModel interface is a marker interface
+     *  The IJewelSelectionModel interface is a simple extension to core ISelectionModel
      *
      *  @langversion 3.0
      *  @playerversion Flash 10.2
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.9.4
      */
-    public interface IDropDownListModel
+    public interface IJewelSelectionModel extends ISelectionModel
     {
-
-        function get offset():int;
-        function set processingInteractiveChange(value:Boolean):void;
+        function set dispatchChangeOnDataProviderChange(value:Boolean):void
     }
 }