The main purpose for that is to avoid using the model itself as the dispatcher. It could still extend EventDispatcher, but the methods would still need overriding to use the host component as the dispatcher instead of 'this'. By using the host component as the primary dispatcher, it avoids pointless redispatching of cloned events from the model. And the extra event creation overhead associated with that. I know this is all UI stuff and probably that is not critical, but I can't assume how many of these will get used in what ways. The model could be completely non-IEventispatcher and always have an external IEventDispatcher provided, but that seemed too radical compared to existing code and the ancestor interfaces etc.
The main thing I think is that it works (so far anyway). And I think it is close to what we discussed. But I will see if it solves the issue that Piotr was seeing. On Fri, Dec 21, 2018 at 8:14 PM Alex Harui <[email protected]> wrote: > 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&data=02%7C01%7Caharui%40adobe.com%7C370c0ff112d44449df1008d6670d4dbc%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636809704172598828&sdata=yS2TSlXOrmQ6Ojy26CuosGhumh48T5z97ZZFqqXuzFY%3D&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/ListSingleSelectionMouseContro > ller.as > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > ller.as > index c19ce5f..604b55e 100644 > --- > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > ller.as > +++ > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > ller.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; > } > } > > > >
