Looks reasonable.  Can you explain why ArrayListSelectionModel should not 
extend EventDispatcher and encapsulate one instead?  Isn't encapsulation more 
code to run?

-Alex

On 12/20/18, 10:26 PM, "[email protected]" <[email protected]> wrote:

    This is an automated email from the ASF dual-hosted git repository.
    
    gregdove pushed a commit to branch 
bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
    in repository 
https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7C370c0ff112d44449df1008d6670d4dbc%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636809704172598828&amp;sdata=yS2TSlXOrmQ6Ojy26CuosGhumh48T5z97ZZFqqXuzFY%3D&amp;reserved=0
    
    commit 448228023f841dd838a94ba3fee2db1c629bf964
    Author: greg-dove <[email protected]>
    AuthorDate: Fri Dec 21 19:25:43 2018 +1300
    
        Cumulative updates to migrate to 'selectionChanged' for bindings
        Fixes a some issues with add/remove/update beads for dataprovider/item 
changes. Added extra test display to Tour de Jewel for this.
    ---
     .../src/main/royale/ListPlayGround.mxml            |   9 ++
     .../royale/org/apache/royale/jewel/ComboBox.as     |   9 +-
     .../royale/org/apache/royale/jewel/DropDownList.as |   8 +-
     .../main/royale/org/apache/royale/jewel/List.as    |   9 +-
     .../jewel/beads/controllers/ComboBoxController.as  |  20 +++-
     .../beads/controllers/DropDownListController.as    |  43 ++++---
     .../ListSingleSelectionMouseController.as          |  42 ++++---
     .../beads/controls/DispatchChangeOnStartup.as      |  41 ++-----
     .../jewel/beads/controls/combobox/SearchFilter.as  |   6 +-
     .../AddListItemRendererForArrayListData.as         |  18 ++-
     .../RemoveListItemRendererForArrayListData.as      |  23 ++--
     .../UpdateListItemRendererForArrayListData.as      |  21 ++--
     .../jewel/beads/models/ArrayListSelectionModel.as  | 127 
+++++++++++++++------
     .../royale/jewel/beads/models/ComboBoxModel.as     |  30 ++---
     .../jewel/beads/models/IDropDownListModel.as       |   1 -
     .../jewel/beads/models/IJewelSelectionModel.as     |   3 +-
     .../royale/jewel/beads/views/ComboBoxView.as       |  14 ++-
     .../royale/jewel/beads/views/DropDownListView.as   |   2 +-
     .../apache/royale/jewel/beads/views/ListView.as    |   6 +-
     19 files changed, 271 insertions(+), 161 deletions(-)
    
    diff --git 
a/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml 
b/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml
    index baad8a6..620b9a2 100644
    --- a/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml
    +++ b/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml
    @@ -109,6 +109,12 @@ limitations under the License.
                                }
                                return intro + evaluated;
                        }
    +
    +                   public function 
describeIconItem(iconObject:Object):String{
    +                           const iconVO:IconListVO = iconObject as 
IconListVO;
    +                           if (!iconVO) return '[Nothing Selected]';
    +                           return 'label:\'' + iconVO.label + '\', 
icon:\'' + iconVO.icon + '\'';
    +                   }
                ]]>
        </fx:Script>
     
    @@ -165,6 +171,9 @@ limitations under the License.
                                                <j:Button text="Remove first 
item" click="removeItemAt()"/>
                                                <j:Button text="Update first 
item" click="updateFirstItem()"/>
                                                <j:Button text="Remove all 
data" click="removeAllData()"/>
    +                                           <j:Label  html="{'Selected 
Index: ' + iconList.selectedIndex}"/>
    +                                           <j:Label  html="Selected Item 
description:"/>
    +                                           <j:Label  
html="{describeIconItem(iconList.selectedItem)}"/>
                                        </j:VGroup>
                                </j:HGroup>
                        </j:Card>
    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 a479008..faf4872 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
    @@ -19,14 +19,10 @@
     package org.apache.royale.jewel
     {
        import org.apache.royale.core.StyledUIBase;
    -    import org.apache.royale.core.IComboBoxModel;
        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
    @@ -119,7 +115,7 @@ package org.apache.royale.jewel
                        IDataProviderModel(model).dataProvider = value;
                }
     
    -        [Bindable("change")]
    +        [Bindable("selectionChanged")]
                /**
                 *  The index of the currently selected item. Changing this 
item changes
                 *  the selectedItem value.
    @@ -142,7 +138,7 @@ package org.apache.royale.jewel
                        ISelectionModel(model).selectedIndex = value;
                }
     
    -        [Bindable("change")]
    +        [Bindable("selectionChanged")]
                /**
                 *  The item currently selected. Changing this value also
                 *  changes the selectedIndex property.
    @@ -180,5 +176,6 @@ package org.apache.royale.jewel
                        }
                        return presModel;
                }
    +
        }
     }
    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 7d2b171..951bafd 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
    @@ -179,7 +179,7 @@ package org.apache.royale.jewel
             //     }
             // }
     
    -        [Bindable("change")]
    +        [Bindable("selectionChanged")]
             /**
              *  The index of the currently selected item. Changing this value
                 *  also changes the selectedItem property.
    @@ -216,7 +216,7 @@ package org.apache.royale.jewel
                 }
             }
     
    -        [Bindable("change")]
    +        [Bindable("selectionChanged")]
             /**
              *  The item currently selected. Changing this value also
                 *  changes the selectedIndex property.
    @@ -297,13 +297,9 @@ package org.apache.royale.jewel
                 var ddModel:IDropDownListModel = model as IDropDownListModel;
                 if (ddModel) {
                     index -= ddModel.offset;
    -                ddModel.setProcessingInteractiveChange(true);
                 }
     
                 model.selectedIndex = index;
    -
    -            if (ddModel)
    -                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 14fb311..ad495e5 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,9 +24,6 @@ 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
        {
    @@ -140,7 +137,7 @@ package org.apache.royale.jewel
                 *  @productversion Royale 0.9.4
                 *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
                 */
    -           [Bindable("change")]
    +           [Bindable("selectionChanged")]
             public function get selectedIndex():int
                {
                        return ISelectionModel(model).selectedIndex;
    @@ -201,7 +198,7 @@ package org.apache.royale.jewel
                 *  @productversion Royale 0.9.4
                 *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
                 */
    -           [Bindable("change")]
    +        [Bindable("selectionChanged")]
                public function get selectedItem():Object
                {
                        return ISelectionModel(model).selectedItem;
    @@ -232,5 +229,7 @@ package org.apache.royale.jewel
                        }
                        return presModel;
                }
    +
    +
                }
     }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as
    index cf187c3..b1fe20d 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as
    @@ -18,7 +18,9 @@
     
////////////////////////////////////////////////////////////////////////////////
     package org.apache.royale.jewel.beads.controllers
     {
    -   COMPILE::SWF
    +import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
    +
    +COMPILE::SWF
        {
                import flash.utils.setTimeout;
         }
    @@ -83,6 +85,13 @@ package org.apache.royale.jewel.beads.controllers
                        } else {
                                
IEventDispatcher(_strand).addEventListener("viewChanged", finishSetup);
                        }
    +                   if (model is IJewelSelectionModel) {
    +                IJewelSelectionModel(model).dispatcher = 
IEventDispatcher(value);
    +                   }
    +                   else {
    +                
IEventDispatcher(model).addEventListener('dataProviderChanged', 
modelChangeHandler);
    +                           
IEventDispatcher(model).addEventListener('selectionChanged', 
modelChangeHandler);
    +            }
                }
     
                /**
    @@ -124,6 +133,11 @@ package org.apache.royale.jewel.beads.controllers
                        list = (popup.view as ComboBoxPopUpView).list;
                        list.addEventListener(MouseEvent.MOUSE_DOWN, 
handleControlMouseDown);
                        list.addEventListener(Event.CHANGE, changeHandler);
    +            if (model is IJewelSelectionModel) {
    +                           //don't let the pop-up's list take over as 
primary dispatcher
    +                           //it needs to stay with the ComboBox (for 
selection bindings to work)
    +                IJewelSelectionModel(model).dispatcher = 
IEventDispatcher(_strand);
    +            }
                }
     
                private var popup:ComboBoxPopUp;
    @@ -180,5 +194,9 @@ package org.apache.royale.jewel.beads.controllers
     
                        IEventDispatcher(_strand).dispatchEvent(new 
Event(Event.CHANGE));
                }
    +
    +        protected function modelChangeHandler(event:Event):void{
    +            IEventDispatcher(_strand).dispatchEvent(new Event(event.type));
    +        }
        }
     }
    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 62d4896..1bddf92 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
    @@ -20,7 +20,7 @@ package org.apache.royale.jewel.beads.controllers
     {
        // import flash.display.DisplayObject;
        // import flash.geom.Point;
    -   
    +
        import org.apache.royale.core.IBeadController;
        import org.apache.royale.core.IStrand;
        import org.apache.royale.events.Event;
    @@ -29,7 +29,8 @@ package org.apache.royale.jewel.beads.controllers
        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;
    +import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
    +import org.apache.royale.jewel.beads.views.DropDownListView;
     
         /**
          *  The DropDownListController class is the controller for
    @@ -39,7 +40,7 @@ package org.apache.royale.jewel.beads.controllers
          *  This controller watches for the click event and displays the
          *  dropdown/popup, and watches the dropdown/popup for change events
          *  and updates the selection model accordingly.
    -     *  
    +     *
          *  @langversion 3.0
          *  @playerversion Flash 10.2
          *  @playerversion AIR 2.6
    @@ -49,7 +50,7 @@ package org.apache.royale.jewel.beads.controllers
        {
             /**
              *  Constructor.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -58,10 +59,10 @@ package org.apache.royale.jewel.beads.controllers
                public function DropDownListController()
                {
                }
    -           
    +
             /**
              *  The model.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -71,7 +72,7 @@ package org.apache.royale.jewel.beads.controllers
     
             /**
              *  The view.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -82,11 +83,12 @@ package org.apache.royale.jewel.beads.controllers
                private var _strand:IStrand;
             /**
              *  @copy org.apache.royale.core.IBead#strand
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
              *  @productversion Royale 0.9.4
    +         *  @royaleignorecoercion org.apache.royale.events.IEventDispatcher
              */
                public function set strand(value:IStrand):void
                {
    @@ -94,7 +96,14 @@ package org.apache.royale.jewel.beads.controllers
                 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);
    +            if (model is IJewelSelectionModel) {
    +                IJewelSelectionModel(model).dispatcher  = 
IEventDispatcher(value);
    +            }
    +            else {
    +                
IEventDispatcher(model).addEventListener('selectionChanged', 
modelChangeHandler);
    +                
IEventDispatcher(model).addEventListener('dataProviderChanged', 
modelChangeHandler);
    +            }
    +
                }
     
             /**
    @@ -104,7 +113,7 @@ package org.apache.royale.jewel.beads.controllers
                {
                        
IEventDispatcher(event.item).addEventListener("itemClicked", selectedHandler);
                }
    -           
    +
             /**
              * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
              */
    @@ -119,7 +128,11 @@ package org.apache.royale.jewel.beads.controllers
                        model.selectedItem = event.data;
                 view.host.dispatchEvent(new Event(Event.CHANGE));
             }
    -           
    +
    +           protected function modelChangeHandler(event:Event):void{
    +                   IEventDispatcher(_strand).dispatchEvent(new 
Event(event.type));
    +           }
    +
             // private function 
clickHandler(event:org.apache.royale.events.MouseEvent):void
             // {
             //     var viewBead:IDropDownListView = 
_strand.getBeadByType(IDropDownListView) as IDropDownListView;
    @@ -137,16 +150,16 @@ package org.apache.royale.jewel.beads.controllers
             //     
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;
    -            
    +
             //     
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;
    @@ -156,6 +169,6 @@ package org.apache.royale.jewel.beads.controllers
             //     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/controllers/ListSingleSelectionMouseController.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseController.as
    index c19ce5f..604b55e 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseController.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseController.as
    @@ -30,8 +30,9 @@ package org.apache.royale.jewel.beads.controllers
        import org.apache.royale.events.ItemClickedEvent;
        import org.apache.royale.events.ItemRemovedEvent;
        import org.apache.royale.html.beads.IListView;
    +import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
     
    -    /**
    +/**
          *  The ListSingleSelectionMouseController class is a controller for
          *  org.apache.royale.jewel.List.  Controllers
          *  watch for events from the interactive portions of a View and
    @@ -40,7 +41,7 @@ package org.apache.royale.jewel.beads.controllers
          *  and updates an ISelectionModel (which only supports single
          *  selection).  Other controller/model pairs would support
          *  various kinds of multiple selection.
    -     *  
    +     *
          *  @langversion 3.0
          *  @playerversion Flash 10.2
          *  @playerversion AIR 2.6
    @@ -50,7 +51,7 @@ package org.apache.royale.jewel.beads.controllers
        {
             /**
              *  Constructor.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -59,10 +60,10 @@ package org.apache.royale.jewel.beads.controllers
                public function ListSingleSelectionMouseController()
                {
                }
    -           
    +
             /**
              *  The model.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -72,7 +73,7 @@ package org.apache.royale.jewel.beads.controllers
     
             /**
              *  The view.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -82,7 +83,7 @@ package org.apache.royale.jewel.beads.controllers
     
             /**
              *  The parent of the item renderers.
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -91,10 +92,10 @@ package org.apache.royale.jewel.beads.controllers
             protected var dataGroup:IItemRendererParent;
     
                private var _strand:IStrand;
    -           
    +
             /**
              *  @copy org.apache.royale.core.IBead#strand
    -         *  
    +         *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
              *  @playerversion AIR 2.6
    @@ -110,8 +111,15 @@ package org.apache.royale.jewel.beads.controllers
                        listView = value.getBeadByType(IListView) as IListView;
                        IEventDispatcher(_strand).addEventListener("itemAdded", 
handleItemAdded);
                        
IEventDispatcher(_strand).addEventListener("itemRemoved", handleItemRemoved);
    +                   if (listModel is IJewelSelectionModel) {
    +                IJewelSelectionModel(listModel).dispatcher  = 
IEventDispatcher(value);
    +                   }
    +            else {
    +                           
IEventDispatcher(listModel).addEventListener('selectionChanged', 
modelChangeHandler);
    +                
IEventDispatcher(listModel).addEventListener('dataProviderChanged', 
modelChangeHandler);
    +            }
                }
    -           
    +
             /**
              * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
              */
    @@ -121,7 +129,7 @@ package org.apache.royale.jewel.beads.controllers
                        
IEventDispatcher(event.item).addEventListener("itemRollOver", rolloverHandler);
                        
IEventDispatcher(event.item).addEventListener("itemRollOut", rolloutHandler);
                }
    -           
    +
             /**
              * @royaleignorecoercion org.apache.royale.events.IEventDispatcher
              */
    @@ -131,14 +139,18 @@ package org.apache.royale.jewel.beads.controllers
                        
IEventDispatcher(event.item).removeEventListener("itemRollOver", 
rolloverHandler);
                        
IEventDispatcher(event.item).removeEventListener("itemRollOut", rolloutHandler);
                }
    -           
    +
                protected function selectedHandler(event:ItemClickedEvent):void
             {
                 listModel.selectedIndex = event.index;
                        listModel.selectedItem = event.data;
                 listView.host.dispatchEvent(new Event(Event.CHANGE));
             }
    -           
    +
    +        protected function modelChangeHandler(event:Event):void{
    +            IEventDispatcher(_strand).dispatchEvent(new Event(event.type));
    +        }
    +
                /**
                 * @royaleemitcoercion 
org.apache.royale.core.ISelectableItemRenderer
              * @royaleignorecoercion org.apache.royale.core.IRollOverModel
    @@ -150,7 +162,7 @@ package org.apache.royale.jewel.beads.controllers
                                IRollOverModel(listModel).rollOverIndex = 
renderer.index;
                        }
                }
    -           
    +
                /**
                 * @royaleemitcoercion 
org.apache.royale.core.ISelectableItemRenderer
              * @royaleignorecoercion org.apache.royale.core.IRollOverModel
    @@ -164,6 +176,6 @@ package org.apache.royale.jewel.beads.controllers
                                IRollOverModel(listModel).rollOverIndex = -1;
                        }
                }
    -   
    +
        }
     }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/DispatchChangeOnStartup.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/DispatchChangeOnStartup.as
    index cf6ef81..94529e4 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/DispatchChangeOnStartup.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/DispatchChangeOnStartup.as
    @@ -22,11 +22,11 @@ package org.apache.royale.jewel.beads.controls
        import org.apache.royale.core.IStrand;
        import org.apache.royale.events.IEventDispatcher;
        import org.apache.royale.events.Event;
    -   import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
    +   import org.apache.royale.core.ISelectionModel;
     
        /**
         *  The DispatchChangeOnStartup bead class is a specialty bead that can 
be used
    -    *  with components that implements IJewelSelectionModel and uses 
dataProvider 
    +    *  with components that implements ISelectionModel and uses 
dataProvider
         *  to dispatch a CHANGE event when the component is initialized
         *
         *  @langversion 3.0
    @@ -63,12 +63,12 @@ package org.apache.royale.jewel.beads.controls
                public function set strand(value:IStrand):void
                {
                        _strand = value;
    -                   
IEventDispatcher(_strand).addEventListener('beadsAdded', onBeadsAdded);
    +                   
IEventDispatcher(_strand).addEventListener('beadsAdded', listenToModel);
                }
     
    -
                /**
    -            *  adjust the way the model behaves for dispatching change 
events
    +            *  listen for the startup selectionChanged Event that occurs 
when dataprovider is assigned
    +            *  and there is a preselected index, fire a change event
                 *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
    @@ -76,37 +76,20 @@ package org.apache.royale.jewel.beads.controls
                 *  @productversion Royale 0.9.4
                 *  @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
                 */
    -           private function onBeadsAdded(event:Event):void
    +           private function listenToModel(event:Event):void
                {
    -                   
IEventDispatcher(_strand).removeEventListener('beadsAdded', onBeadsAdded);
    -                   const model:IJewelSelectionModel = 
_strand.getBeadByType(IJewelSelectionModel) as IJewelSelectionModel;
    +                   
IEventDispatcher(_strand).removeEventListener('beadsAdded', listenToModel);
    +                   const model:ISelectionModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
                        if (model) {
    -                           
IEventDispatcher(model).addEventListener('dataProviderChanged', onChange);
    -                           
IEventDispatcher(model).addEventListener('selectedItemChanged', onChange);
    -                
IEventDispatcher(model).addEventListener('selectedIndexChanged', onChange);
    -                   } else {
    -                           //for now
    -                           throw new Error('DispatchChangeOnStartup bead 
is not yet compatible with the component it is being applied to');
    +                           
IEventDispatcher(model).addEventListener('selectionChanged', onChange);
                        }
                }
     
    -           private var _sawDataProviderChange:Boolean;
                private function onChange(event:Event):void{
    -                   if (event.type == 'dataProviderChanged') {
    -                           _sawDataProviderChange = true;
    -                           return;
    -                   }
    -                   //event here is normal change event
    -                   if (!_sawDataProviderChange) {
    -                           //wait for a change event after 
dataProviderChange? needs review, maybe not
    -                           return;
    -                   }
    -                   const model:IJewelSelectionModel = 
_strand.getBeadByType(IJewelSelectionModel) as IJewelSelectionModel;
    -                   
IEventDispatcher(model).removeEventListener('dataProviderChanged', onChange);
    -            
IEventDispatcher(model).removeEventListener('selectedItemChanged', onChange);
    -            
IEventDispatcher(model).removeEventListener('selectedIndexChanged', onChange);
    +                   const model:ISelectionModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
    +                   
IEventDispatcher(model).removeEventListener('selectionChanged', onChange);
    +                   IEventDispatcher(_strand).dispatchEvent(new 
Event('change'));
     
    -            IEventDispatcher(_strand).dispatchEvent(new Event("change"));
                }
        }
     }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/combobox/SearchFilter.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/combobox/SearchFilter.as
    index dbf444c..7ac6b59 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/combobox/SearchFilter.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/combobox/SearchFilter.as
    @@ -115,7 +115,7 @@ package org.apache.royale.jewel.beads.controls.combobox
                {
                        const inputBase:TextInputBase = event.target as 
TextInputBase;
                        //keyup can include other things like tab navigation
    -            IComboBoxView
    +
                        if (!inputBase) {
                                //if (popUpVisible)  
event.target.parent.view.popUpVisible = false;
                                return;
    @@ -153,10 +153,10 @@ package 
org.apache.royale.jewel.beads.controls.combobox
                         ir.visible = false;
                     }
                 }
    -            if (count == 1) {
    +           /* if (count == 1) {
                     //select lastActive if there is only one that matches?
     
    -            }
    +            }*/
                }
     
        }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/AddListItemRendererForArrayListData.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/AddListItemRendererForArrayListData.as
    index 36311b8..498cf62 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/AddListItemRendererForArrayListData.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/AddListItemRendererForArrayListData.as
    @@ -75,7 +75,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                        _strand = value;
                        
IEventDispatcher(value).addEventListener("initComplete", initComplete);
                }
    -           
    +
                /**
                 *  finish setup
                 *
    @@ -87,16 +87,16 @@ package org.apache.royale.jewel.beads.itemRenderers
                protected function initComplete(event:Event):void
                {
                        
IEventDispatcher(_strand).removeEventListener("initComplete", initComplete);
    -                   
    +
                        _dataProviderModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
                        labelField = _dataProviderModel.labelField;
     
    -                   
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);   
    +                   
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);
     
                        // invoke now in case "dataProviderChanged" has already 
been dispatched.
                        dataProviderChangeHandler(null);
                }
    -           
    +
                private var dp:IEventDispatcher;
                /**
                 * @private
    @@ -110,7 +110,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                        dp = dataProviderModel.dataProvider as IEventDispatcher;
                        if (!dp)
                                return;
    -                   
    +
                        // listen for individual items being added in the 
future.
                        dp.addEventListener(CollectionEvent.ITEM_ADDED, 
handleItemAdded);
                }
    @@ -124,6 +124,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                 *  @productversion Royale 0.9.4
                 *  @royaleignorecoercion 
org.apache.royale.core.ISelectableItemRenderer
                 *  @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
    +         *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
                 */
                protected function handleItemAdded(event:CollectionEvent):void
                {
    @@ -131,7 +132,8 @@ package org.apache.royale.jewel.beads.itemRenderers
                 var ir:ISelectableItemRenderer = 
itemRendererFactory.createItemRenderer(itemRendererParent) as 
ISelectableItemRenderer;
     
                 fillRenderer(event.index, event.item, ir, presentationModel);
    -                   
    +
    +
                        // update the index values in the itemRenderers to 
correspond to their shifted positions.
                        var n:int = itemRendererParent.numItemRenderers;
                        for (var i:int = event.index; i < n; i++)
    @@ -139,6 +141,10 @@ package org.apache.royale.jewel.beads.itemRenderers
                                ir = itemRendererParent.getItemRendererAt(i) as 
ISelectableItemRenderer;
                                ir.index = i;
                        }
    +            //adjust the model's selectedIndex, if applicable
    +                   if (event.index <= 
ISelectionModel(_dataProviderModel).selectedIndex) {
    +                ISelectionModel(_dataProviderModel).selectedIndex = 
ISelectionModel(_dataProviderModel).selectedIndex + 1;
    +                   }
     
                        (_strand as IEventDispatcher).dispatchEvent(new 
Event("layoutNeeded"));
                }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/RemoveListItemRendererForArrayListData.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/RemoveListItemRendererForArrayListData.as
    index d591553..eec8ea5 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/RemoveListItemRendererForArrayListData.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/RemoveListItemRendererForArrayListData.as
    @@ -32,7 +32,7 @@ package org.apache.royale.jewel.beads.itemRenderers
        import org.apache.royale.html.beads.IListView;
     
        /**
    -    *  Handles the removal of an itemRenderer in a List component once the 
corresponding 
    +    *  Handles the removal of an itemRenderer in a List component once the 
corresponding
         *  datum has been removed from the IDataProviderModel.
         *
         *  @langversion 3.0
    @@ -69,7 +69,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                        _strand = value;
                        
IEventDispatcher(value).addEventListener("initComplete", initComplete);
                }
    -           
    +
                /**
                 *  finish setup
                 *
    @@ -81,14 +81,14 @@ package org.apache.royale.jewel.beads.itemRenderers
                protected function initComplete(event:Event):void
                {
                        
IEventDispatcher(_strand).removeEventListener("initComplete", initComplete);
    -                   
    +
                        _dataProviderModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
    -                   
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);   
    -                   
    +                   
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);
    +
                        // invoke now in case "dataProviderChanged" has already 
been dispatched.
                        dataProviderChangeHandler(null);
                }
    -           
    +
                private var dp:IEventDispatcher;
                /**
                 * @private
    @@ -102,7 +102,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                        dp = dataProviderModel.dataProvider as IEventDispatcher;
                        if (!dp)
                                return;
    -                   
    +
                        // listen for individual items being removed in the 
future.
                        dp.addEventListener(CollectionEvent.ITEM_REMOVED, 
handleItemRemoved);
                }
    @@ -116,12 +116,13 @@ package org.apache.royale.jewel.beads.itemRenderers
                 *  @productversion Royale 0.9.4
                 *  @royaleignorecoercion 
org.apache.royale.core.ISelectableItemRenderer
                 *  @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
    +            *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
                 */
                protected function handleItemRemoved(event:CollectionEvent):void
                {
                        var ir:ISelectableItemRenderer = 
itemRendererParent.getItemRendererAt(event.index) as ISelectableItemRenderer;
                        itemRendererParent.removeItemRenderer(ir);
    -                   
    +
                        // adjust the itemRenderers' index to adjust for the 
shift
                        var n:int = itemRendererParent.numItemRenderers;
                        for (var i:int = event.index; i < n; i++)
    @@ -129,6 +130,12 @@ package org.apache.royale.jewel.beads.itemRenderers
                                ir = itemRendererParent.getItemRendererAt(i) as 
ISelectableItemRenderer;
                                ir.index = i;
                        }
    +                   //adjust the model's selectedIndex, if applicable
    +            if (event.index < 
ISelectionModel(_dataProviderModel).selectedIndex) {
    +                ISelectionModel(_dataProviderModel).selectedIndex = 
ISelectionModel(_dataProviderModel).selectedIndex - 1;
    +            } else if (event.index == 
ISelectionModel(_dataProviderModel).selectedIndex) {
    +                ISelectionModel(_dataProviderModel).selectedIndex = -1;
    +            }
     
                        (_strand as IEventDispatcher).dispatchEvent(new 
Event("layoutNeeded"));
                }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/UpdateListItemRendererForArrayListData.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/UpdateListItemRendererForArrayListData.as
    index 245eea4..2f511dd 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/UpdateListItemRendererForArrayListData.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/UpdateListItemRendererForArrayListData.as
    @@ -31,7 +31,7 @@ package org.apache.royale.jewel.beads.itemRenderers
        import org.apache.royale.html.beads.IListView;
     
         /**
    -    *  Handles the update of an itemRenderer in a List component once the 
corresponding 
    +    *  Handles the update of an itemRenderer in a List component once the 
corresponding
         *  datum has been updated from the IDataProviderModel.
         *
         *  @langversion 3.0
    @@ -71,7 +71,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                        _strand = value;
                        
IEventDispatcher(value).addEventListener("initComplete", initComplete);
                }
    -           
    +
                /**
                 *  finish setup
                 *
    @@ -84,16 +84,16 @@ package org.apache.royale.jewel.beads.itemRenderers
                protected function initComplete(event:Event):void
                {
                        
IEventDispatcher(_strand).removeEventListener("initComplete", initComplete);
    -                   
    +
                        _dataProviderModel = 
_strand.getBeadByType(ISelectionModel) as ISelectionModel;
                        labelField = _dataProviderModel.labelField;
     
    -                   
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);   
    +                   
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);
     
                        // invoke now in case "dataProviderChanged" has already 
been dispatched.
                        dataProviderChangeHandler(null);
                }
    -           
    +
                private var dp:IEventDispatcher;
                /**
                 * @private
    @@ -108,7 +108,7 @@ package org.apache.royale.jewel.beads.itemRenderers
                        dp = dataProviderModel.dataProvider as IEventDispatcher;
                        if (!dp)
                                return;
    -                   
    +
                        // listen for individual items being updated in the 
future.
                        dp.addEventListener(CollectionEvent.ITEM_UPDATED, 
handleItemUpdated);
                }
    @@ -121,13 +121,20 @@ package org.apache.royale.jewel.beads.itemRenderers
                 *  @playerversion AIR 2.6
                 *  @productversion Royale 0.9.4
                 *  @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
    +         *  @royaleignorecoercion org.apache.royale.core.ISelectionModel
                 */
                protected function handleItemUpdated(event:CollectionEvent):void
                {
                 var ir:ISelectableItemRenderer = 
itemRendererParent.getItemRendererAt(event.index) as ISelectableItemRenderer;
    -                   
    +
                 setData(ir, event.item, event.index);
     
    +            if (event.index == 
ISelectionModel(_dataProviderModel).selectedIndex) {
    +                           //manually trigger a selection change, even if 
there was actually none.
    +                           //This causes selection-based bindings to work
    +                IEventDispatcher(_dataProviderModel).dispatchEvent(new 
Event('selectionChanged'));
    +            }
    +
                        (_strand as IEventDispatcher).dispatchEvent(new 
Event("layoutNeeded"));
                }
     
    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 3da08ee..74c10b3 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
    @@ -20,10 +20,15 @@ package org.apache.royale.jewel.beads.models
     {
        import org.apache.royale.collections.IArrayList;
        import org.apache.royale.core.IRollOverModel;
    -   import org.apache.royale.core.ISelectionModel;
        import org.apache.royale.core.IStrand;
        import org.apache.royale.events.Event;
        import org.apache.royale.events.EventDispatcher;
    +   import org.apache.royale.events.IEventDispatcher;
    +   import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
    +
    +   COMPILE::SWF{
    +           import flash.events.Event;
    +   }
     
         /**
          *  The ArrayListSelectionModel class is a selection model for
    @@ -35,7 +40,7 @@ package org.apache.royale.jewel.beads.models
          *  @playerversion AIR 2.6
          *  @productversion Royale 0.9.4
          */
    -   public class ArrayListSelectionModel extends EventDispatcher implements 
IJewelSelectionModel, IRollOverModel
    +   public class ArrayListSelectionModel implements IJewelSelectionModel, 
IRollOverModel
        {
             /**
              *  Constructor.
    @@ -49,10 +54,65 @@ package org.apache.royale.jewel.beads.models
                {
                }
     
    -           private var _dispatchChangeOnDataChange:Boolean;
    -           public function set 
dispatchChangeOnDataProviderChange(value:Boolean):void{
    -            _dispatchChangeOnDataChange = value;
    +           //IJewelSelectionModel
    +           private var _dispatcher:IEventDispatcher;
    +        private function getDispatcher():IEventDispatcher {
    +                   if (!_dispatcher) _dispatcher = new 
EventDispatcher(this) as IEventDispatcher;
    +                   return _dispatcher;
    +           }
    +        public function set dispatcher(value:IEventDispatcher):void{
    +                   _dispatcher = value;
    +           }
    +
    +           //IEventDispatcher JS
    +           COMPILE::JS
    +           public function addEventListener(type:String, handler:Function, 
opt_capture:Boolean = false, opt_handlerScope:Object = null):void{
    +                   getDispatcher().addEventListener(type, handler, 
opt_capture, opt_handlerScope);
                }
    +           COMPILE::JS
    +           public function removeEventListener(type:String, 
handler:Function, opt_capture:Boolean = false, opt_handlerScope:Object = 
null):void{
    +                   getDispatcher().removeEventListener(type, handler, 
opt_capture, opt_handlerScope);
    +           }
    +
    +           COMPILE::JS
    +           public function dispatchEvent(event:Object):Boolean{
    +                   return getDispatcher().dispatchEvent(event);
    +           }
    +
    +
    +
    +        //IEventDispatcher SWF
    +           COMPILE::SWF
    +           public function addEventListener(type:String, 
listener:Function, useCapture:Boolean = false, priority:int = 0, 
useWeakReference:Boolean = false):void {
    +                   getDispatcher().addEventListener(type, listener, 
useCapture, priority, useWeakReference);
    +           }
    +           COMPILE::SWF
    +           public function removeEventListener(type:String, 
listener:Function, useCapture:Boolean = false):void{
    +                   getDispatcher().removeEventListener(type, listener, 
useCapture);
    +           }
    +
    +           COMPILE::SWF
    +           public function dispatchEvent(event:flash.events.Event):Boolean{
    +                   return getDispatcher().dispatchEvent(event);
    +           }
    +
    +        COMPILE::SWF
    +        public function willTrigger(type:String):Boolean{
    +            return getDispatcher().willTrigger(type);
    +        }
    +
    +           //IEventDispatcher (shared)
    +        public function hasEventListener(type:String):Boolean{
    +            return getDispatcher().hasEventListener(type);
    +        }
    +
    +        /**
    +         *  @private
    +         */
    +           protected function dispatchChange(eventName:String):void{
    +                   dispatchEvent(new 
org.apache.royale.events.Event(eventName));
    +        }
    +
     
                private var _strand:IStrand;
     
    @@ -69,17 +129,9 @@ 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")]
             /**
              *  @copy org.apache.royale.core.ISelectionModel#dataProvider
              *
    @@ -127,11 +179,10 @@ package org.apache.royale.jewel.beads.models
                     _selectedIndex = -1;
                 }
     
    -            dispatchEvent(new Event("dataProviderChanged"));
    -            if (itemChanged)
    -                dispatchEvent(new Event("selectedItemChanged"));
    -            if (oldIndex != _selectedIndex)
    -                dispatchEvent(new Event("selectedIndexChanged"));
    +            dispatchChange("dataProviderChanged");
    +                   if (itemChanged || oldIndex != _selectedIndex) {
    +                dispatchChange("selectionChanged");
    +                   }
                }
     
                private var _selectedIndex:int = -1;
    @@ -158,7 +209,7 @@ package org.apache.royale.jewel.beads.models
                {
                        if (value != _labelField) {
                                _labelField = value;
    -                           dispatchEvent(new Event("labelFieldChanged"));
    +                dispatchChange("labelFieldChanged");
                        }
                }
     
    @@ -186,7 +237,6 @@ package org.apache.royale.jewel.beads.models
                 }
                 if (value == _selectedIndex) return;
     
    -            const oldItem:Object = _selectedItem;
                 _selectedIndex = value < _dataProvider.length ? value : 
_dataProvider.length - 1;
                 if (_selectedIndex != -1) {
                     _selectedItem = _dataProvider.getItemAt(_selectedIndex);
    @@ -194,9 +244,7 @@ package org.apache.royale.jewel.beads.models
                     _selectedItem = null;
                 }
     
    -            if ( oldItem != _selectedItem)
    -                dispatchEvent(new Event("selectedItemChanged"));
    -            dispatchEvent(new Event("selectedIndexChanged"));
    +            dispatchChange("selectionChanged");
                }
     
             /**
    @@ -219,7 +267,7 @@ package org.apache.royale.jewel.beads.models
                {
                        if (value != _rollOverIndex) {
                                _rollOverIndex = value;
    -                           dispatchEvent(new 
Event("rollOverIndexChanged"));
    +                dispatchChange("rollOverIndexChanged");
                        }
                }
     
    @@ -243,22 +291,26 @@ 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));
    -
    -                dispatchEvent(new Event("selectedItemChanged"));
    -                if (indexChanged)
    -                    dispatchEvent(new Event("selectedIndexChanged"));
    -            }
    +            if (value == _selectedItem) {
    +                           if (_dataProvider) {
    +                                   if (_selectedIndex != (_selectedIndex = 
_dataProvider.getItemIndex(value))) {
    +                        dispatchChange("selectionChanged");
    +                                   }
    +                           }
    +            } else {
    +                _selectedItem = value;
    +                if (_dataProvider) {
    +                    _selectedIndex = _dataProvider.getItemIndex(value);
    +                    dispatchChange("selectionChanged");
    +                }
    +                   }
                }
     
                private var _selectedString:String;
     
             /**
              *  An alternative to selectedItem for strongly typing the
    -         *  the selectedItem if the Array is an Array of Strings.
    +         *  the selectedItem if the dataProvider is an ArrayList of 
Strings.
              *
              *  @langversion 3.0
              *  @playerversion Flash 10.2
    @@ -277,6 +329,7 @@ package org.apache.royale.jewel.beads.models
                {
                        _selectedString = value;
                        var n:int = _dataProvider.length;
    +                   var oldIndex:int = _selectedIndex;
                        for (var i:int = 0; i < n; i++)
                        {
                                if (String(_dataProvider.getItemAt(i)) == value)
    @@ -285,8 +338,10 @@ package org.apache.royale.jewel.beads.models
                                        break;
                                }
                        }
    -                   dispatchEvent(new Event("selectedItemChanged"));
    -                   dispatchEvent(new Event("selectedIndexChanged"));
    +                   if (_selectedIndex != oldIndex) {
    +                dispatchChange("selectionChanged");
    +            }
    +
                }
        }
     }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ComboBoxModel.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ComboBoxModel.as
    index 9d3f097..11757f0 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ComboBoxModel.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/ComboBoxModel.as
    @@ -22,11 +22,11 @@ package org.apache.royale.jewel.beads.models
        import org.apache.royale.core.IBead;
        import org.apache.royale.core.IComboBoxModel;
        import org.apache.royale.events.Event;
    -                   
    +
        /**
    -    *  The ComboBoxModel class bead extends 
org.apache.royale.jewel.beads.models.ArrayListSelectionModel 
    +    *  The ComboBoxModel class bead extends 
org.apache.royale.jewel.beads.models.ArrayListSelectionModel
         *  and adds the text being displayed by the 
org.apache.royale.jewel.ComboBox's input field.
    -    *  
    +    *
         *  @langversion 3.0
         *  @playerversion Flash 10.2
         *  @playerversion AIR 2.6
    @@ -36,7 +36,7 @@ package org.apache.royale.jewel.beads.models
        {
                /**
                 *  constructor.
    -            *  
    +            *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
    @@ -47,12 +47,12 @@ package org.apache.royale.jewel.beads.models
                }
     
                private var _text:String;
    -           
    +
                /**
                 *  The string to display in the 
org.apache.royale.html.ComboBox input field.
    -            * 
    +            *
                 *  @copy org.apache.royale.core.IComboBoxModel#text
    -            *  
    +            *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
    @@ -62,23 +62,23 @@ package org.apache.royale.jewel.beads.models
                {
                        return _text;
                }
    -           
    +
                public function set text(value:String):void
                {
                        if (value != _text)
                        {
                                _text = value;
    -                           dispatchEvent(new Event("textChange"));
    +                           dispatchChange("textChange");
                        }
                }
    -           
    +
                private var _html:String;
    -           
    +
                /**
                 *  The HTML string to display in the 
org.apache.royale.html.ComboBox input field.
    -            * 
    +            *
                 *  @copy org.apache.royale.core.IComboBoxModel#html
    -            *  
    +            *
                 *  @langversion 3.0
                 *  @playerversion Flash 10.2
                 *  @playerversion AIR 2.6
    @@ -88,13 +88,13 @@ package org.apache.royale.jewel.beads.models
                {
                        return _html;
                }
    -           
    +
                public function set html(value:String):void
                {
                        if (value != _html)
                        {
                                _html = value;
    -                           dispatchEvent(new Event("htmlChange"));
    +                dispatchChange("htmlChange");
                        }
                }
        }
    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 43c75b3..eec3c8d 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,5 @@ package org.apache.royale.jewel.beads.models
         {
     
             function get offset():int;
    -        function setProcessingInteractiveChange(value:Boolean):void;
         }
     }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
    index 62903df..9a0cadd 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/IJewelSelectionModel.as
    @@ -20,6 +20,7 @@ package org.apache.royale.jewel.beads.models
     {
     
         import org.apache.royale.core.ISelectionModel;
    +    import org.apache.royale.events.IEventDispatcher
     
         /**
          *  The IJewelSelectionModel interface is a simple extension to core 
ISelectionModel
    @@ -31,6 +32,6 @@ package org.apache.royale.jewel.beads.models
          */
         public interface IJewelSelectionModel extends ISelectionModel
         {
    -        function set dispatchChangeOnDataProviderChange(value:Boolean):void
    +        function set dispatcher(value:IEventDispatcher):void;
         }
     }
    diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ComboBoxView.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ComboBoxView.as
    index cb029ea..b54e12b 100644
    --- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ComboBoxView.as
    +++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ComboBoxView.as
    @@ -18,7 +18,9 @@
     
////////////////////////////////////////////////////////////////////////////////
     package org.apache.royale.jewel.beads.views
     {
    -   COMPILE::SWF
    +import org.apache.royale.jewel.beads.models.IJewelSelectionModel;
    +
    +COMPILE::SWF
        {
                import flash.utils.setTimeout;
         }
    @@ -138,8 +140,14 @@ package org.apache.royale.jewel.beads.views
                        host.addElement(_button);
     
                        model = _strand.getBeadByType(IComboBoxModel) as 
IComboBoxModel;
    -                   model.addEventListener("selectedIndexChanged", 
handleItemChange);
    -                   model.addEventListener("selectedItemChanged", 
handleItemChange);
    +
    +                   if (model is IJewelSelectionModel) {
    +                           //do this here as well as in the controller,
    +                           //to cover possible variation in the order of 
bead instantiation
    +                           //this avoids the need to redispatch new event 
clones at the component level in the controller
    +                IJewelSelectionModel(model).dispatcher = 
IEventDispatcher(value);
    +                   }
    +                   model.addEventListener("selectionChanged", 
handleItemChange);
                        model.addEventListener("dataProviderChanged", 
itemChangeAction);
     
                        
IEventDispatcher(_strand).addEventListener("sizeChanged", handleSizeChange);
    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 36cd549..a43aba0 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
    @@ -101,7 +101,7 @@ COMPILE::JS
                override protected function handleInitComplete(event:Event):void
                {
                        model = _strand.getBeadByType(ISelectionModel) as 
ISelectionModel;
    -                   model.addEventListener("selectedIndexChanged", 
selectionChangeHandler);
    +                   model.addEventListener("selectionChanged", 
selectionChangeHandler);
     
                        super.handleInitComplete(event);
                }
    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 3f6ab5d..e64912d 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
    @@ -89,7 +89,7 @@ package org.apache.royale.jewel.beads.views
                override protected function handleInitComplete(event:Event):void
                {
                        listModel = _strand.getBeadByType(ISelectionModel) as 
ISelectionModel;
    -                   listModel.addEventListener("selectedIndexChanged", 
selectionChangeHandler);
    +                   listModel.addEventListener("selectionChanged", 
selectionChangeHandler);
                        listModel.addEventListener("rollOverIndexChanged", 
rollOverIndexChangeHandler);
                        
IEventDispatcher(_strand).addEventListener("itemsCreated", itemsCreatedHandler);
     
    @@ -187,7 +187,7 @@ package org.apache.royale.jewel.beads.views
                        super.handleInitComplete(event);
     
                        listModel = _strand.getBeadByType(ISelectionModel) as 
ISelectionModel;
    -                   listModel.addEventListener("selectedIndexChanged", 
selectionChangeHandler);
    +                   listModel.addEventListener("selectionChanged", 
selectionChangeHandler);
                        listModel.addEventListener("rollOverIndexChanged", 
rollOverIndexChangeHandler);
                }
     
    @@ -220,7 +220,7 @@ package org.apache.royale.jewel.beads.views
                        ir = 
dataGroup.getItemRendererAt(IRollOverModel(listModel).rollOverIndex) as 
ISelectableItemRenderer;
                        if(ir)
                                ir.hovered = true;
    -                   
    +
                        lastRollOverIndex = 
IRollOverModel(listModel).rollOverIndex;
                }
        }
    
    

Reply via email to