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

[royale-asjs] branch bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List updated (14f6354 -> 4482280)

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

gregdove pushed a change to branch bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git.


    from 14f6354  DispatchChangeOnStartup: Dispatch "change" based on selected item/index model changes
     add c96c967  Make drop target sensitive to position in item renderer
     add 09cbf5e  Royale framework folders weren't being recognized by FB
     add 9c21cd7  Replace royale with flex in .project files and fix Basic
     add 7b3958b  Merge branch 'fix_fb' into develop
     add d0fc3d3  Fix dragSource always being added last in ArrayList
     add 07f3fbe  Fix previous items jumping down before item is dropped
     add 58a0bf0  new Jewel PopUp component (still in development but working)
     add e8d8d8c  jewel PopUp initial theme setup
     add abd62eb  jewel popup example in Tour de Jewel (initial)
     add 334f846  make popup content make white background by default. PopUp content needs as well define width/height to show properly
     add a836d18  Merge branch 'develop' of https://github.com/apache/royale-asjs into develop
     add f673306  Fix end of list drop
     add 819e89a  Minor change: Jewel TextArea is not resizable by default. If needed, a bead to enable this will be added in the future.
     add d300897  update test to include source bundles
     add 1a1ccf9  need {locale} in source-path for resources to output bundles with the right name
     new bbbd6ea  Merge branch 'develop' into bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
     new 4482280  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.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../src/main/resources/jewel-example-styles.css    |   5 +
 .../src/main/royale/ListPlayGround.mxml            |   9 ++
 .../TourDeJewel/src/main/royale/MainContent.mxml   |   1 +
 ...agePlayGround.mxml => PopUpViewPlayGround.mxml} |  29 ++--
 .../main/royale/components/SomePopUpContent.mxml   |  15 +-
 .../src/main/royale/models/MainNavigationModel.as  |   3 +-
 frameworks/projects/Basic/.actionScriptProperties  |  24 ++-
 frameworks/projects/Binding/.project               |   6 +-
 frameworks/projects/Charts/.project                |   6 +-
 frameworks/projects/Collections/.project           |   6 +-
 frameworks/projects/Core/.project                  |   6 +-
 frameworks/projects/CreateJS/.project              |   6 +-
 frameworks/projects/DragDrop/.project              |   6 +-
 .../DragDrop/src/main/resources/basic-manifest.xml |   1 +
 ...s => SensitiveSingleSelectionDropTargetBead.as} | 162 +++++++++-----------
 frameworks/projects/Effects/.project               |   6 +-
 frameworks/projects/Flat/.project                  |   6 +-
 frameworks/projects/Formatters/.project            |   6 +-
 frameworks/projects/GoogleMaps/.project            |   6 +-
 frameworks/projects/Graphics/.project              |   6 +-
 frameworks/projects/HTML/.project                  |   6 +-
 frameworks/projects/HTML5/.project                 |   6 +-
 frameworks/projects/JQuery/.project                |   6 +-
 .../projects/Jewel/src/main/resources/defaults.css |  87 +++++++++++
 .../Jewel/src/main/resources/jewel-manifest.xml    |   1 +
 .../projects/Jewel/src/main/royale/JewelClasses.as |   3 +
 .../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 +-
 .../apache/royale/jewel/{DateField.as => PopUp.as} |  61 ++++----
 .../jewel/beads/controllers/ComboBoxController.as  |  20 ++-
 .../beads/controllers/DropDownListController.as    |  43 ++++--
 .../ListSingleSelectionMouseController.as          |  42 +++--
 ...dMouseController.as => PopUpMouseController.as} |  60 +++-----
 .../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 +-
 .../models/{SnackbarModel.as => PopUpModel.as}     |  69 +++++----
 .../royale/jewel/beads/views/ComboBoxView.as       |  14 +-
 .../royale/jewel/beads/views/DropDownListView.as   |   2 +-
 .../apache/royale/jewel/beads/views/ListView.as    |   6 +-
 .../beads/views/{DateFieldView.as => PopUpView.as} | 170 +++++----------------
 .../components/{_datefield.sass => _popup.sass}    |  90 ++++-------
 .../Jewel/src/main/sass/components/_textinput.sass |  15 +-
 .../projects/Jewel/src/main/sass/defaults.sass     |   1 +
 frameworks/projects/Mobile/.project                |   6 +-
 frameworks/projects/Network/.project               |   6 +-
 frameworks/projects/Reflection/.project            |   6 +-
 .../_popup.sass}                                   |   9 +-
 .../themes/JewelTheme/src/main/sass/defaults.sass  |   1 +
 manualtests/ResourceManagerTest/build.xml          |   3 +
 .../locale/en_US/messages.properties}              |   8 +-
 .../locale/tr_TR/messages.properties}              |   8 +-
 .../src/ResourceManagerTest.mxml                   |  18 ++-
 60 files changed, 735 insertions(+), 643 deletions(-)
 copy examples/royale/TourDeJewel/src/main/royale/{ImagePlayGround.mxml => PopUpViewPlayGround.mxml} (66%)
 copy marmotinni/tests/Royale/framework/org/apache/royale/html/staticControls/TextButton/MyInitialView.mxml => examples/royale/TourDeJewel/src/main/royale/components/SomePopUpContent.mxml (71%)
 copy frameworks/projects/DragDrop/src/main/royale/org/apache/royale/html/beads/{SingleSelectionDropTargetBead.as => SensitiveSingleSelectionDropTargetBead.as} (76%)
 copy frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/{DateField.as => PopUp.as} (67%)
 copy frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/{DateFieldMouseController.as => PopUpMouseController.as} (72%)
 copy frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/models/{SnackbarModel.as => PopUpModel.as} (74%)
 copy frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/{DateFieldView.as => PopUpView.as} (56%)
 copy frameworks/projects/Jewel/src/main/sass/components/{_datefield.sass => _popup.sass} (56%)
 copy frameworks/themes/JewelTheme/src/main/sass/{components-emphasized/_controlbar.sass => components-primary/_popup.sass} (93%)
 copy manualtests/{LocaleTest/src/locale/en_US/main.properties => ResourceManagerTest/locale/en_US/messages.properties} (92%)
 copy manualtests/{LocaleTest/src/locale/en_US/main.properties => ResourceManagerTest/locale/tr_TR/messages.properties} (92%)


Re: [royale-asjs] 02/02: 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.

Posted by Greg Dove <gr...@gmail.com>.
Piotr, just to confirm... my changes do already 'dispatch off strand'
directly from the model for the list-like components. We were just
discussing improvements to how that can be implemented generally. I also
pushed some updates since last time...

On Sat, 22 Dec 2018, 20:35 Piotr Zarzycki <piotrzarzycki21@gmail.com wrote:

> Hi Guys,
>
> Great discussion so far. I always thought in 2C, dispatch off the strand.
> That's not a big change and doubt that it break anything in your real world
> app.
>
> I tried yesterday build whole framework by Maven and rebuild my app as well
> by Maven - I have the same issue as I mentioned in other thread.
>
> I will try today build Tour the Jewel. Probably my problem with double
> dispatch will be fixed - cause it was fixed even on the previous stage when
> I changed the code.
>
> All discussion has been started by me cause my changes break programmatic
> selection.
>
> If I see after Tour de Jewel rebuild that both issues are solved we can
> merge that branch to develop (Greg may want to change dispatch off the
> strand in the models - are you going?).
>
> In case of trying changes in my application - I have a feeling that I'm
> missing something in my prepared pom.xml for that app. Solution for me is
> to try IDE ready build prepared by ant. Quick resolution for me is allow on
> Jenkins build that branch. Longer resolution is to run ant build on my end.
> - However I have still unresolved problem with running unit test - Flash
> Player. Something is broken in my system, cause I cannot associate swf to
> be runnable default Flash Player. Yishay propose me some solution on the
> list and we have tried it when we met at beginning of December together.
> Nothing works. Maybe I will try to read about registry - maybe there is a
> way of change that association in registry, so I will be able to fully run
> ant.
>
> Short story - if both issue are working and we may want to make changes
> (dispatch off strand) I'm +1 for merging.
>
> Thanks,
> Piotr
>
> On Sat, Dec 22, 2018, 7:06 AM Greg Dove <gr...@gmail.com> wrote:
>
> > 'Have you solved Piotr's problem?  We should first understand what it
> takes
> > to solve his problem before going further into these kinds of changes.'
> >
> > tbh, I kinda lost track of the details of that. My original understanding
> > was that it was related to double-dispatch of change event. But that was
> > because change event was the binding event, and not the model changes,
> so I
> > had put efforts in to dispatch more 'change' events to get binding to
> work.
> > Model changes for selection were being redispatched as 'change'. Now,
> > 'change' should only be dispatched alongside a subset of model changes
> (and
> > only represent the interaction changes a user made). So if that is
> working
> > correctly, I hope it is fixed. Will wait to hear...
> >
> >
> >
> > On Sat, Dec 22, 2018 at 6:29 PM Alex Harui <ah...@adobe.com.invalid>
> > wrote:
> >
> > > Ah, the shared model problem.
> > >
> > > I'm not afraid of some "radical" changes.  The main constraint is if we
> > > have time to do it.  But better to change all dozens of beads now
> > instead
> > > of 100's later when we have lots of apps in production on them.  In
> some
> > > ways, we are only now finding out what more sophisticated apps need, so
> > I'm
> > > not surprised to see some of these issues arise.
> > >
> > > The fundamental pattern we are discussing about EventDispatcher is a
> > > communication issue.  Royale has lots of beads, Flex didn't, so
> > > communicating between all of these pieces is new territory.  Seems like
> > > there are several choices:
> > >
> > > 1) Any bead that can be "shared" must dispatch events from itself.
> > > Strands choose which events to re-dispatch out of the component.  This
> > is,
> > > I think, what we've done most in the code base.  The main downsides are
> > the
> > > re-dispatch, and the usability of knowing which beads are shared, or
> else
> > > all model beads have to dispatch from themselves.
> > > 2) All beads should dispatch off the strand.  This is pretty
> > > straightforward except when beads are shared.  The options around
> sharing
> > > are (at minimum):
> > >    A) Beads are never shared.  We should stop sharing the beads that
> are
> > > currently shared and have a "proxy" bead that gets a reference to the
> > model
> > > bead and proxies all APIs to the original bead
> > >    B) Beads are shared.  Beads that expect sharing keep a list of
> > > strands.  I don't like this too much.  Beads would have to be planned
> to
> > be
> > > shared.
> > >    C) Beads that expect sharing ignore any subsequent setting of the
> > > strand so they only dispatch off the original strand which is hopefully
> > > always the top-level component (TLC).  Any other placing of the bead on
> > the
> > > strand is ignored and the secondary strand that was ignored should
> have a
> > > reference back to the TLC and should listen to the TLC.  There is still
> > > some upfront planning in that I don’t' think we want all strands to
> check
> > > if they've already been set.  But it might be most acceptable in that
> > there
> > > is still only one strand to dispatch from, instead of multiple in 2B.
> > The
> > > other weird thing is that the second strand doesn't have a model on its
> > > strand, just a reference to the model from the base class.  That would
> > mean
> > > that the recommended pattern for accessing the model is "(strand as
> > > IStrandWithModel).model" and not "strand.getBeadByType(IBeadModel)"
> > >
> > > I'd be up for trying 2C.  Other ideas, like not having a strand at all,
> > > but some other concept like subscribers, is a bit too radical for me.
> > IMO,
> > > strand, beads, and MVC are common enough and work often enough that it
> > > wouldn't be PAYG to have the base implementations have code to handle
> > > sharing "just-in-case" they are shared.
> > >
> > > Then we can see how 1 compares to 2C in terms of code size,
> performance,
> > > etc.
> > >
> > > Have you solved Piotr's problem?  We should first understand what it
> > takes
> > > to solve his problem before going further into these kinds of changes.
> > >
> > > My 2 cents,
> > > -Alex
> > >
> > >
> > >
> > >
> > > On 12/21/18, 8:47 PM, "Greg Dove" <gr...@gmail.com> wrote:
> > >
> > >     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
> <aharui@adobe.com.invalid
> > >
> > > 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" <gr...@gmail.com> 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
> > > <ah...@adobe.com.invalid>
> > >     > 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, "gregdove@apache.org" <
> > > gregdove@apache.org>
> > >     > wrote:
> > >     >     >
> > >     >     >     This is an automated email from the ASF dual-hosted git
> > >     > repository.
> > >     >     >
> > >     >     >     gregdove pushed a commit to branch
> > >     >     >
> > bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
> > >     >     >     in repository
> > >     >     >
> > >     >
> > >
> >
> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7Cb8dc9a70eab44dee7f2e08d667c88139%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636810508217157168&amp;sdata=1b%2BYXsV1OFOxDNpnj9TIRqHU0feOnf3EAXb0kX4COQ0%3D&amp;reserved=0
> > >     >     >
> > >     >     >     commit 448228023f841dd838a94ba3fee2db1c629bf964
> > >     >     >     Author: greg-dove <gr...@gmail.com>
> > >     >     >     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));
> > >     >     >              }
> > >     >     >     -
> > >     >     >     +
> > >     >     >     +

Re: [royale-asjs] 02/02: 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.

Posted by Piotr Zarzycki <pi...@gmail.com>.
Hi Guys,

Great discussion so far. I always thought in 2C, dispatch off the strand.
That's not a big change and doubt that it break anything in your real world
app.

I tried yesterday build whole framework by Maven and rebuild my app as well
by Maven - I have the same issue as I mentioned in other thread.

I will try today build Tour the Jewel. Probably my problem with double
dispatch will be fixed - cause it was fixed even on the previous stage when
I changed the code.

All discussion has been started by me cause my changes break programmatic
selection.

If I see after Tour de Jewel rebuild that both issues are solved we can
merge that branch to develop (Greg may want to change dispatch off the
strand in the models - are you going?).

In case of trying changes in my application - I have a feeling that I'm
missing something in my prepared pom.xml for that app. Solution for me is
to try IDE ready build prepared by ant. Quick resolution for me is allow on
Jenkins build that branch. Longer resolution is to run ant build on my end.
- However I have still unresolved problem with running unit test - Flash
Player. Something is broken in my system, cause I cannot associate swf to
be runnable default Flash Player. Yishay propose me some solution on the
list and we have tried it when we met at beginning of December together.
Nothing works. Maybe I will try to read about registry - maybe there is a
way of change that association in registry, so I will be able to fully run
ant.

Short story - if both issue are working and we may want to make changes
(dispatch off strand) I'm +1 for merging.

Thanks,
Piotr

On Sat, Dec 22, 2018, 7:06 AM Greg Dove <gr...@gmail.com> wrote:

> 'Have you solved Piotr's problem?  We should first understand what it takes
> to solve his problem before going further into these kinds of changes.'
>
> tbh, I kinda lost track of the details of that. My original understanding
> was that it was related to double-dispatch of change event. But that was
> because change event was the binding event, and not the model changes, so I
> had put efforts in to dispatch more 'change' events to get binding to work.
> Model changes for selection were being redispatched as 'change'. Now,
> 'change' should only be dispatched alongside a subset of model changes (and
> only represent the interaction changes a user made). So if that is working
> correctly, I hope it is fixed. Will wait to hear...
>
>
>
> On Sat, Dec 22, 2018 at 6:29 PM Alex Harui <ah...@adobe.com.invalid>
> wrote:
>
> > Ah, the shared model problem.
> >
> > I'm not afraid of some "radical" changes.  The main constraint is if we
> > have time to do it.  But better to change all dozens of beads now
> instead
> > of 100's later when we have lots of apps in production on them.  In some
> > ways, we are only now finding out what more sophisticated apps need, so
> I'm
> > not surprised to see some of these issues arise.
> >
> > The fundamental pattern we are discussing about EventDispatcher is a
> > communication issue.  Royale has lots of beads, Flex didn't, so
> > communicating between all of these pieces is new territory.  Seems like
> > there are several choices:
> >
> > 1) Any bead that can be "shared" must dispatch events from itself.
> > Strands choose which events to re-dispatch out of the component.  This
> is,
> > I think, what we've done most in the code base.  The main downsides are
> the
> > re-dispatch, and the usability of knowing which beads are shared, or else
> > all model beads have to dispatch from themselves.
> > 2) All beads should dispatch off the strand.  This is pretty
> > straightforward except when beads are shared.  The options around sharing
> > are (at minimum):
> >    A) Beads are never shared.  We should stop sharing the beads that are
> > currently shared and have a "proxy" bead that gets a reference to the
> model
> > bead and proxies all APIs to the original bead
> >    B) Beads are shared.  Beads that expect sharing keep a list of
> > strands.  I don't like this too much.  Beads would have to be planned to
> be
> > shared.
> >    C) Beads that expect sharing ignore any subsequent setting of the
> > strand so they only dispatch off the original strand which is hopefully
> > always the top-level component (TLC).  Any other placing of the bead on
> the
> > strand is ignored and the secondary strand that was ignored should have a
> > reference back to the TLC and should listen to the TLC.  There is still
> > some upfront planning in that I don’t' think we want all strands to check
> > if they've already been set.  But it might be most acceptable in that
> there
> > is still only one strand to dispatch from, instead of multiple in 2B.
> The
> > other weird thing is that the second strand doesn't have a model on its
> > strand, just a reference to the model from the base class.  That would
> mean
> > that the recommended pattern for accessing the model is "(strand as
> > IStrandWithModel).model" and not "strand.getBeadByType(IBeadModel)"
> >
> > I'd be up for trying 2C.  Other ideas, like not having a strand at all,
> > but some other concept like subscribers, is a bit too radical for me.
> IMO,
> > strand, beads, and MVC are common enough and work often enough that it
> > wouldn't be PAYG to have the base implementations have code to handle
> > sharing "just-in-case" they are shared.
> >
> > Then we can see how 1 compares to 2C in terms of code size, performance,
> > etc.
> >
> > Have you solved Piotr's problem?  We should first understand what it
> takes
> > to solve his problem before going further into these kinds of changes.
> >
> > My 2 cents,
> > -Alex
> >
> >
> >
> >
> > On 12/21/18, 8:47 PM, "Greg Dove" <gr...@gmail.com> wrote:
> >
> >     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 <aharui@adobe.com.invalid
> >
> > 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" <gr...@gmail.com> 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
> > <ah...@adobe.com.invalid>
> >     > 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, "gregdove@apache.org" <
> > gregdove@apache.org>
> >     > wrote:
> >     >     >
> >     >     >     This is an automated email from the ASF dual-hosted git
> >     > repository.
> >     >     >
> >     >     >     gregdove pushed a commit to branch
> >     >     >
> bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
> >     >     >     in repository
> >     >     >
> >     >
> >
> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7Cb8dc9a70eab44dee7f2e08d667c88139%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636810508217157168&amp;sdata=1b%2BYXsV1OFOxDNpnj9TIRqHU0feOnf3EAXb0kX4COQ0%3D&amp;reserved=0
> >     >     >
> >     >     >     commit 448228023f841dd838a94ba3fee2db1c629bf964
> >     >     >     Author: greg-dove <gr...@gmail.com>
> >     >     >     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 i

Re: [royale-asjs] 02/02: 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.

Posted by Greg Dove <gr...@gmail.com>.
'Have you solved Piotr's problem?  We should first understand what it takes
to solve his problem before going further into these kinds of changes.'

tbh, I kinda lost track of the details of that. My original understanding
was that it was related to double-dispatch of change event. But that was
because change event was the binding event, and not the model changes, so I
had put efforts in to dispatch more 'change' events to get binding to work.
Model changes for selection were being redispatched as 'change'. Now,
'change' should only be dispatched alongside a subset of model changes (and
only represent the interaction changes a user made). So if that is working
correctly, I hope it is fixed. Will wait to hear...



On Sat, Dec 22, 2018 at 6:29 PM Alex Harui <ah...@adobe.com.invalid> wrote:

> Ah, the shared model problem.
>
> I'm not afraid of some "radical" changes.  The main constraint is if we
> have time to do it.  But better to change all dozens of beads now  instead
> of 100's later when we have lots of apps in production on them.  In some
> ways, we are only now finding out what more sophisticated apps need, so I'm
> not surprised to see some of these issues arise.
>
> The fundamental pattern we are discussing about EventDispatcher is a
> communication issue.  Royale has lots of beads, Flex didn't, so
> communicating between all of these pieces is new territory.  Seems like
> there are several choices:
>
> 1) Any bead that can be "shared" must dispatch events from itself.
> Strands choose which events to re-dispatch out of the component.  This is,
> I think, what we've done most in the code base.  The main downsides are the
> re-dispatch, and the usability of knowing which beads are shared, or else
> all model beads have to dispatch from themselves.
> 2) All beads should dispatch off the strand.  This is pretty
> straightforward except when beads are shared.  The options around sharing
> are (at minimum):
>    A) Beads are never shared.  We should stop sharing the beads that are
> currently shared and have a "proxy" bead that gets a reference to the model
> bead and proxies all APIs to the original bead
>    B) Beads are shared.  Beads that expect sharing keep a list of
> strands.  I don't like this too much.  Beads would have to be planned to be
> shared.
>    C) Beads that expect sharing ignore any subsequent setting of the
> strand so they only dispatch off the original strand which is hopefully
> always the top-level component (TLC).  Any other placing of the bead on the
> strand is ignored and the secondary strand that was ignored should have a
> reference back to the TLC and should listen to the TLC.  There is still
> some upfront planning in that I don’t' think we want all strands to check
> if they've already been set.  But it might be most acceptable in that there
> is still only one strand to dispatch from, instead of multiple in 2B.  The
> other weird thing is that the second strand doesn't have a model on its
> strand, just a reference to the model from the base class.  That would mean
> that the recommended pattern for accessing the model is "(strand as
> IStrandWithModel).model" and not "strand.getBeadByType(IBeadModel)"
>
> I'd be up for trying 2C.  Other ideas, like not having a strand at all,
> but some other concept like subscribers, is a bit too radical for me.  IMO,
> strand, beads, and MVC are common enough and work often enough that it
> wouldn't be PAYG to have the base implementations have code to handle
> sharing "just-in-case" they are shared.
>
> Then we can see how 1 compares to 2C in terms of code size, performance,
> etc.
>
> Have you solved Piotr's problem?  We should first understand what it takes
> to solve his problem before going further into these kinds of changes.
>
> My 2 cents,
> -Alex
>
>
>
>
> On 12/21/18, 8:47 PM, "Greg Dove" <gr...@gmail.com> wrote:
>
>     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 <ah...@adobe.com.invalid>
> 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" <gr...@gmail.com> 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
> <ah...@adobe.com.invalid>
>     > 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, "gregdove@apache.org" <
> gregdove@apache.org>
>     > wrote:
>     >     >
>     >     >     This is an automated email from the ASF dual-hosted git
>     > repository.
>     >     >
>     >     >     gregdove pushed a commit to branch
>     >     > bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
>     >     >     in repository
>     >     >
>     >
> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7Cb8dc9a70eab44dee7f2e08d667c88139%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636810508217157168&amp;sdata=1b%2BYXsV1OFOxDNpnj9TIRqHU0feOnf3EAXb0kX4COQ0%3D&amp;reserved=0
>     >     >
>     >     >     commit 448228023f841dd838a94ba3fee2db1c629bf964
>     >     >     Author: greg-dove <gr...@gmail.com>
>     >     >     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;
>     >     >                 }
>     >     >         }
>     >     >
>     >     >
>     >     >
>     >     >
>     >
>     >
>     >
>
>
>

Re: [royale-asjs] 02/02: 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.

Posted by Alex Harui <ah...@adobe.com.INVALID>.
Ah, the shared model problem.

I'm not afraid of some "radical" changes.  The main constraint is if we have time to do it.  But better to change all dozens of beads now  instead of 100's later when we have lots of apps in production on them.  In some ways, we are only now finding out what more sophisticated apps need, so I'm not surprised to see some of these issues arise.

The fundamental pattern we are discussing about EventDispatcher is a communication issue.  Royale has lots of beads, Flex didn't, so communicating between all of these pieces is new territory.  Seems like there are several choices:

1) Any bead that can be "shared" must dispatch events from itself.  Strands choose which events to re-dispatch out of the component.  This is, I think, what we've done most in the code base.  The main downsides are the re-dispatch, and the usability of knowing which beads are shared, or else all model beads have to dispatch from themselves.
2) All beads should dispatch off the strand.  This is pretty straightforward except when beads are shared.  The options around sharing are (at minimum):
   A) Beads are never shared.  We should stop sharing the beads that are currently shared and have a "proxy" bead that gets a reference to the model bead and proxies all APIs to the original bead
   B) Beads are shared.  Beads that expect sharing keep a list of strands.  I don't like this too much.  Beads would have to be planned to be shared.
   C) Beads that expect sharing ignore any subsequent setting of the strand so they only dispatch off the original strand which is hopefully always the top-level component (TLC).  Any other placing of the bead on the strand is ignored and the secondary strand that was ignored should have a reference back to the TLC and should listen to the TLC.  There is still some upfront planning in that I don’t' think we want all strands to check if they've already been set.  But it might be most acceptable in that there is still only one strand to dispatch from, instead of multiple in 2B.  The other weird thing is that the second strand doesn't have a model on its strand, just a reference to the model from the base class.  That would mean that the recommended pattern for accessing the model is "(strand as IStrandWithModel).model" and not "strand.getBeadByType(IBeadModel)"

I'd be up for trying 2C.  Other ideas, like not having a strand at all, but some other concept like subscribers, is a bit too radical for me.  IMO, strand, beads, and MVC are common enough and work often enough that it wouldn't be PAYG to have the base implementations have code to handle sharing "just-in-case" they are shared.

Then we can see how 1 compares to 2C in terms of code size, performance, etc.

Have you solved Piotr's problem?  We should first understand what it takes to solve his problem before going further into these kinds of changes.

My 2 cents,
-Alex




On 12/21/18, 8:47 PM, "Greg Dove" <gr...@gmail.com> wrote:

    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 <ah...@adobe.com.invalid> 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" <gr...@gmail.com> 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 <ah...@adobe.com.invalid>
    > 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, "gregdove@apache.org" <gr...@apache.org>
    > wrote:
    >     >
    >     >     This is an automated email from the ASF dual-hosted git
    > repository.
    >     >
    >     >     gregdove pushed a commit to branch
    >     > bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
    >     >     in repository
    >     >
    > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7Cb8dc9a70eab44dee7f2e08d667c88139%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636810508217157168&amp;sdata=1b%2BYXsV1OFOxDNpnj9TIRqHU0feOnf3EAXb0kX4COQ0%3D&amp;reserved=0
    >     >
    >     >     commit 448228023f841dd838a94ba3fee2db1c629bf964
    >     >     Author: greg-dove <gr...@gmail.com>
    >     >     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;
    >     >                 }
    >     >         }
    >     >
    >     >
    >     >
    >     >
    >
    >
    >
    


Re: [royale-asjs] 02/02: 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.

Posted by Greg Dove <gr...@gmail.com>.
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 <ah...@adobe.com.invalid> 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" <gr...@gmail.com> 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 <ah...@adobe.com.invalid>
> 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, "gregdove@apache.org" <gr...@apache.org>
> wrote:
>     >
>     >     This is an automated email from the ASF dual-hosted git
> repository.
>     >
>     >     gregdove pushed a commit to branch
>     > bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
>     >     in repository
>     >
> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7C1527ebb22eb84f335f2808d6671890a4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636809752581738272&amp;sdata=w6zNiHeGx20jRFshj9ituYRhd8RglSC0Cl4bh1uC%2Bt4%3D&amp;reserved=0
>     >
>     >     commit 448228023f841dd838a94ba3fee2db1c629bf964
>     >     Author: greg-dove <gr...@gmail.com>
>     >     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;
>     >                 }
>     >         }
>     >
>     >
>     >
>     >
>
>
>

Re: [royale-asjs] 02/02: 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.

Posted by Alex Harui <ah...@adobe.com.INVALID>.
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" <gr...@gmail.com> 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 <ah...@adobe.com.invalid> 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, "gregdove@apache.org" <gr...@apache.org> wrote:
    >
    >     This is an automated email from the ASF dual-hosted git repository.
    >
    >     gregdove pushed a commit to branch
    > bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
    >     in repository
    > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7C1527ebb22eb84f335f2808d6671890a4%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636809752581738272&amp;sdata=w6zNiHeGx20jRFshj9ituYRhd8RglSC0Cl4bh1uC%2Bt4%3D&amp;reserved=0
    >
    >     commit 448228023f841dd838a94ba3fee2db1c629bf964
    >     Author: greg-dove <gr...@gmail.com>
    >     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;
    >                 }
    >         }
    >
    >
    >
    >
    


Re: [royale-asjs] 02/02: 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.

Posted by Greg Dove <gr...@gmail.com>.
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 <ah...@adobe.com.invalid> 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, "gregdove@apache.org" <gr...@apache.org> wrote:
>
>     This is an automated email from the ASF dual-hosted git repository.
>
>     gregdove pushed a commit to branch
> bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List
>     in repository
> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&amp;data=02%7C01%7Caharui%40adobe.com%7C370c0ff112d44449df1008d6670d4dbc%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636809704172598828&amp;sdata=yS2TSlXOrmQ6Ojy26CuosGhumh48T5z97ZZFqqXuzFY%3D&amp;reserved=0
>
>     commit 448228023f841dd838a94ba3fee2db1c629bf964
>     Author: greg-dove <gr...@gmail.com>
>     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;
>                 }
>         }
>
>
>
>

Re: [royale-asjs] 02/02: 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.

Posted by Alex Harui <ah...@adobe.com.INVALID>.
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, "gregdove@apache.org" <gr...@apache.org> wrote:

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


[royale-asjs] 02/02: 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.

Posted by gr...@apache.org.
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://gitbox.apache.org/repos/asf/royale-asjs.git

commit 448228023f841dd838a94ba3fee2db1c629bf964
Author: greg-dove <gr...@gmail.com>
AuthorDate: Fri Dec 21 19:25:43 2018 +1300

    Cumulative updates to migrate to 'selectionChanged' for bindings
    Fixes a some issues with add/remove/update beads for dataprovider/item changes. Added extra test display to Tour de Jewel for this.
---
 .../src/main/royale/ListPlayGround.mxml            |   9 ++
 .../royale/org/apache/royale/jewel/ComboBox.as     |   9 +-
 .../royale/org/apache/royale/jewel/DropDownList.as |   8 +-
 .../main/royale/org/apache/royale/jewel/List.as    |   9 +-
 .../jewel/beads/controllers/ComboBoxController.as  |  20 +++-
 .../beads/controllers/DropDownListController.as    |  43 ++++---
 .../ListSingleSelectionMouseController.as          |  42 ++++---
 .../beads/controls/DispatchChangeOnStartup.as      |  41 ++-----
 .../jewel/beads/controls/combobox/SearchFilter.as  |   6 +-
 .../AddListItemRendererForArrayListData.as         |  18 ++-
 .../RemoveListItemRendererForArrayListData.as      |  23 ++--
 .../UpdateListItemRendererForArrayListData.as      |  21 ++--
 .../jewel/beads/models/ArrayListSelectionModel.as  | 127 +++++++++++++++------
 .../royale/jewel/beads/models/ComboBoxModel.as     |  30 ++---
 .../jewel/beads/models/IDropDownListModel.as       |   1 -
 .../jewel/beads/models/IJewelSelectionModel.as     |   3 +-
 .../royale/jewel/beads/views/ComboBoxView.as       |  14 ++-
 .../royale/jewel/beads/views/DropDownListView.as   |   2 +-
 .../apache/royale/jewel/beads/views/ListView.as    |   6 +-
 19 files changed, 271 insertions(+), 161 deletions(-)

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


[royale-asjs] 01/02: Merge branch 'develop' into bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List

Posted by gr...@apache.org.
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://gitbox.apache.org/repos/asf/royale-asjs.git

commit bbbd6eaee93ae81226a5d2e49e5537b84e1a1e28
Merge: 14f6354 1a1ccf9
Author: greg-dove <gr...@gmail.com>
AuthorDate: Fri Dec 21 19:04:07 2018 +1300

    Merge branch 'develop' into bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List

 .../src/main/resources/jewel-example-styles.css    |   5 +
 .../TourDeJewel/src/main/royale/MainContent.mxml   |   1 +
 .../src/main/royale/PopUpViewPlayGround.mxml       |  57 +++
 .../main/royale/components/SomePopUpContent.mxml   |  29 +-
 .../src/main/royale/models/MainNavigationModel.as  |   3 +-
 frameworks/projects/Basic/.actionScriptProperties  |  24 +-
 frameworks/projects/Binding/.project               |   6 +-
 frameworks/projects/Charts/.project                |   6 +-
 frameworks/projects/Collections/.project           |   6 +-
 frameworks/projects/Core/.project                  |   6 +-
 frameworks/projects/CreateJS/.project              |   6 +-
 frameworks/projects/DragDrop/.project              |   6 +-
 .../DragDrop/src/main/resources/basic-manifest.xml |   1 +
 .../SensitiveSingleSelectionDropTargetBead.as      | 411 +++++++++++++++++++++
 frameworks/projects/Effects/.project               |   6 +-
 frameworks/projects/Flat/.project                  |   6 +-
 frameworks/projects/Formatters/.project            |   6 +-
 frameworks/projects/GoogleMaps/.project            |   6 +-
 frameworks/projects/Graphics/.project              |   6 +-
 frameworks/projects/HTML/.project                  |   6 +-
 frameworks/projects/HTML5/.project                 |   6 +-
 frameworks/projects/JQuery/.project                |   6 +-
 .../projects/Jewel/src/main/resources/defaults.css |  87 +++++
 .../Jewel/src/main/resources/jewel-manifest.xml    |   1 +
 .../projects/Jewel/src/main/royale/JewelClasses.as |   3 +
 .../main/royale/org/apache/royale/jewel/PopUp.as   | 109 ++++++
 .../beads/controllers/PopUpMouseController.as      | 184 +++++++++
 .../apache/royale/jewel/beads/models/PopUpModel.as | 142 +++++++
 .../apache/royale/jewel/beads/views/PopUpView.as   | 237 ++++++++++++
 .../Jewel/src/main/sass/components/_popup.sass     | 126 +++++++
 .../Jewel/src/main/sass/components/_textinput.sass |  15 +-
 .../projects/Jewel/src/main/sass/defaults.sass     |   1 +
 frameworks/projects/Mobile/.project                |   6 +-
 frameworks/projects/Network/.project               |   6 +-
 frameworks/projects/Reflection/.project            |   6 +-
 .../src/main/sass/components-primary/_popup.sass   |  27 ++
 .../themes/JewelTheme/src/main/sass/defaults.sass  |   1 +
 manualtests/ResourceManagerTest/build.xml          |   3 +
 .../locale/en_US/messages.properties               |  24 ++
 .../locale/tr_TR/messages.properties               |  24 ++
 .../src/ResourceManagerTest.mxml                   |  18 +-
 41 files changed, 1553 insertions(+), 82 deletions(-)