I don't need to assign the external dispatcher, because it is already
available as _strand inside model, is that what you mean? I missed seeing
the wood for the trees there.
I guess I was looking at it from the outside-in via the controller which
seemed to be first to start adding listeners to the model, and not thinking
about the model as having the 'external dispatcher' (_strand) reference
already, so that's a good thing to have my eyes opened about :). Thanks!
In terms of IEventDispatcher-ness, what I was trying to do here was to make
something that worked within what I understood to be the 'current
conventions'. In order to do that I actually wanted the API surface to be
the same, because I assumed that those conventions were 'how we do things
around here' (the existing code is all I have to determine this, and I did
not follow the rules the first time, so I was trying to both 'follow the
rules' and make improvements). I think a lot of existing code which
involves adding listeners to the model should continue to work with the
type of approach I used (making allowance for the change from
'selectedIndexChanged' to 'selectionChanged' etc) .
But changing the events in the model all to something like
_strand.dispatchEvent('selectionChange') definitely could work too, and the
model need not be an IEventDispatcher at all, as I mentioned previously - I
had just considered that approach as 'too radical' when I thought about
what appeared to be the current conventions. It's clearer now to me that
you are not afraid to change those :).
That will require scouring all the code that currently adds listeners to
the model and finding ways to ensure it explicitly listens to the top level
component (the one that is being supported for binding) instead, and making
sure that the current strand which represents that does not change inside
the model if the model gets shared (as it does for example in combobox).
Probably the first strand assigned could be considered the dispatcher, and
kept as a reference I guess. But I won't have more time to spend on this
probably for a couple of weeks now. I think what I did so far is an
improvement for now at least, and a partial transition towards what you
suggest (within Jewel, anyway). Hopefully when Piotr can test what he is
using it for, it will help with the issues he was seeing.
fwiw I haven't seen binding event loops or any issues like that yet either.
On Sat, Dec 22, 2018 at 3:26 PM Alex Harui <[email protected]> wrote:
> I'm sorry, I'm just not getting it. If you want to dispatch off the host,
> just use the strand. I still don't see the need to encapsulate an
> EventDispatcher and wire it up to the API surfaces.
>
> We should pick a dispatch "convention" for beads. Either they dispatch
> off themselves and other folks have to listen to the beads or they should
> dispatch off the strand. I agree that the latter sounds more efficient.
> I tried to remember of there was some situation where dispatching off the
> strand would cause trouble like loops or too much traffic or collisions
> with events from other beads, but none came to mind.
>
> Thanks,
> -Alex
>
> On 12/20/18, 11:47 PM, "Greg Dove" <[email protected]> wrote:
>
> 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%7C1527ebb22eb84f335f2808d6671890a4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636809752581738272&sdata=w6zNiHeGx20jRFshj9ituYRhd8RglSC0Cl4bh1uC%2Bt4%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;
> > }
> > }
> >
> >
> >
> >
>
>
>