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 <[email protected] 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 <[email protected]> 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 <[email protected]> > > 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" <[email protected]> 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 > <[email protected] > > > > > > wrote: > > > > > > > I'm sorry, I'm just not getting it. If you want to dispatch off > > the > > > host, > > > > just use the strand. I still don't see the need to encapsulate > an > > > > EventDispatcher and wire it up to the API surfaces. > > > > > > > > We should pick a dispatch "convention" for beads. Either they > > > dispatch > > > > off themselves and other folks have to listen to the beads or > they > > > should > > > > dispatch off the strand. I agree that the latter sounds more > > > efficient. > > > > I tried to remember of there was some situation where dispatching > > > off the > > > > strand would cause trouble like loops or too much traffic or > > > collisions > > > > with events from other beads, but none came to mind. > > > > > > > > Thanks, > > > > -Alex > > > > > > > > On 12/20/18, 11:47 PM, "Greg Dove" <[email protected]> wrote: > > > > > > > > The main purpose for that is to avoid using the model itself > as > > > the > > > > dispatcher. It could still extend EventDispatcher, but the > > > methods > > > > would > > > > still need overriding to use the host component as the > > dispatcher > > > > instead > > > > of 'this'. By using the host component as the primary > > > dispatcher, it > > > > avoids > > > > pointless redispatching of cloned events from the model. And > > the > > > extra > > > > event creation overhead associated with that. > > > > I know this is all UI stuff and probably that is not > critical, > > > but I > > > > can't > > > > assume how many of these will get used in what ways. > > > > The model could be completely non-IEventispatcher and always > > > have an > > > > external IEventDispatcher provided, but that seemed too > > radical > > > > compared > > > > to existing code and the ancestor interfaces etc. > > > > > > > > The main thing I think is that it works (so far anyway). And > I > > > think > > > > it is > > > > close to what we discussed. > > > > > > > > But I will see if it solves the issue that Piotr was seeing. > > > > > > > > > > > > On Fri, Dec 21, 2018 at 8:14 PM Alex Harui > > > <[email protected]> > > > > wrote: > > > > > > > > > Looks reasonable. Can you explain why > > ArrayListSelectionModel > > > > should not > > > > > extend EventDispatcher and encapsulate one instead? Isn't > > > > encapsulation > > > > > more code to run? > > > > > > > > > > -Alex > > > > > > > > > > On 12/20/18, 10:26 PM, "[email protected]" < > > > [email protected]> > > > > wrote: > > > > > > > > > > This is an automated email from the ASF dual-hosted git > > > > repository. > > > > > > > > > > gregdove pushed a commit to branch > > > > > > > bugfix/issue_353_double_dispatch_of_change_event_in_Jewel_List > > > > > in repository > > > > > > > > > > > > > > > https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitbox.apache.org%2Frepos%2Fasf%2Froyale-asjs.git&data=02%7C01%7Caharui%40adobe.com%7Cb8dc9a70eab44dee7f2e08d667c88139%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636810508217157168&sdata=1b%2BYXsV1OFOxDNpnj9TIRqHU0feOnf3EAXb0kX4COQ0%3D&reserved=0 > > > > > > > > > > commit 448228023f841dd838a94ba3fee2db1c629bf964 > > > > > Author: greg-dove <[email protected]> > > > > > AuthorDate: Fri Dec 21 19:25:43 2018 +1300 > > > > > > > > > > Cumulative updates to migrate to 'selectionChanged' > > for > > > > bindings > > > > > Fixes a some issues with add/remove/update beads > for > > > > > dataprovider/item changes. Added extra test display to Tour > > de > > > Jewel > > > > for > > > > > this. > > > > > --- > > > > > .../src/main/royale/ListPlayGround.mxml | > 9 > > > ++ > > > > > .../royale/org/apache/royale/jewel/ComboBox.as | > 9 > > > +- > > > > > .../royale/org/apache/royale/jewel/DropDownList.as | > 8 > > > +- > > > > > .../main/royale/org/apache/royale/jewel/List.as | > 9 > > > +- > > > > > .../jewel/beads/controllers/ComboBoxController.as | > 20 > > > +++- > > > > > .../beads/controllers/DropDownListController.as | > 43 > > > ++++--- > > > > > .../ListSingleSelectionMouseController.as | > > 42 > > > > ++++--- > > > > > .../beads/controls/DispatchChangeOnStartup.as | > 41 > > > ++----- > > > > > .../jewel/beads/controls/combobox/SearchFilter.as | > 6 > > > +- > > > > > .../AddListItemRendererForArrayListData.as | > 18 > > > ++- > > > > > .../RemoveListItemRendererForArrayListData.as | > 23 > > > ++-- > > > > > .../UpdateListItemRendererForArrayListData.as | > 21 > > > ++-- > > > > > .../jewel/beads/models/ArrayListSelectionModel.as | > 127 > > > > > +++++++++++++++------ > > > > > .../royale/jewel/beads/models/ComboBoxModel.as | > 30 > > > ++--- > > > > > .../jewel/beads/models/IDropDownListModel.as | > > 1 - > > > > > .../jewel/beads/models/IJewelSelectionModel.as | > 3 > > > +- > > > > > .../royale/jewel/beads/views/ComboBoxView.as | > 14 > > > ++- > > > > > .../royale/jewel/beads/views/DropDownListView.as | > 2 > > > +- > > > > > .../apache/royale/jewel/beads/views/ListView.as | > 6 > > > +- > > > > > 19 files changed, 271 insertions(+), 161 deletions(-) > > > > > > > > > > diff --git > > > > > > > > a/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml > > > > > > > > b/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml > > > > > index baad8a6..620b9a2 100644 > > > > > --- > > > > a/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml > > > > > +++ > > > > b/examples/royale/TourDeJewel/src/main/royale/ListPlayGround.mxml > > > > > @@ -109,6 +109,12 @@ limitations under the License. > > > > > } > > > > > return intro + evaluated; > > > > > } > > > > > + > > > > > + public function > > > > > describeIconItem(iconObject:Object):String{ > > > > > + const iconVO:IconListVO = > > > iconObject > > > > as > > > > > IconListVO; > > > > > + if (!iconVO) return > '[Nothing > > > > Selected]'; > > > > > + return 'label:\'' + > > > iconVO.label + > > > > '\', > > > > > icon:\'' + iconVO.icon + '\''; > > > > > + } > > > > > ]]> > > > > > </fx:Script> > > > > > > > > > > @@ -165,6 +171,9 @@ limitations under the License. > > > > > <j:Button > > > > text="Remove > > > > > first item" click="removeItemAt()"/> > > > > > <j:Button > > > > text="Update > > > > > first item" click="updateFirstItem()"/> > > > > > <j:Button > > > > text="Remove all > > > > > data" click="removeAllData()"/> > > > > > + <j:Label > > > > html="{'Selected > > > > > Index: ' + iconList.selectedIndex}"/> > > > > > + <j:Label > > > > html="Selected > > > > > Item description:"/> > > > > > + <j:Label > > > > > html="{describeIconItem(iconList.selectedItem)}"/> > > > > > </j:VGroup> > > > > > </j:HGroup> > > > > > </j:Card> > > > > > diff --git > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as > > > > > index a479008..faf4872 100644 > > > > > --- > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as > > > > > +++ > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/ComboBox.as > > > > > @@ -19,14 +19,10 @@ > > > > > package org.apache.royale.jewel > > > > > { > > > > > import org.apache.royale.core.StyledUIBase; > > > > > - import org.apache.royale.core.IComboBoxModel; > > > > > import org.apache.royale.core.ISelectionModel; > > > > > import org.apache.royale.core.IDataProviderModel; > > > > > import > org.apache.royale.core.IListPresentationModel; > > > > > - import > > > > org.apache.royale.jewel.beads.models.IJewelSelectionModel; > > > > > import > > > > org.apache.royale.jewel.beads.models.ListPresentationModel; > > > > > - import org.apache.royale.events.IEventDispatcher; > > > > > - import org.apache.royale.events.Event; > > > > > > > > > > //-------------------------------------- > > > > > // Events > > > > > @@ -119,7 +115,7 @@ package org.apache.royale.jewel > > > > > > > IDataProviderModel(model).dataProvider > > > = > > > > value; > > > > > } > > > > > > > > > > - [Bindable("change")] > > > > > + [Bindable("selectionChanged")] > > > > > /** > > > > > * The index of the currently selected > item. > > > > Changing > > > > > this item changes > > > > > * the selectedItem value. > > > > > @@ -142,7 +138,7 @@ package org.apache.royale.jewel > > > > > > ISelectionModel(model).selectedIndex > > = > > > value; > > > > > } > > > > > > > > > > - [Bindable("change")] > > > > > + [Bindable("selectionChanged")] > > > > > /** > > > > > * The item currently selected. Changing > > this > > > value > > > > also > > > > > * changes the selectedIndex property. > > > > > @@ -180,5 +176,6 @@ package org.apache.royale.jewel > > > > > } > > > > > return presModel; > > > > > } > > > > > + > > > > > } > > > > > } > > > > > diff --git > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as > > > > > index 7d2b171..951bafd 100644 > > > > > --- > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as > > > > > +++ > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/DropDownList.as > > > > > @@ -179,7 +179,7 @@ package org.apache.royale.jewel > > > > > // } > > > > > // } > > > > > > > > > > - [Bindable("change")] > > > > > + [Bindable("selectionChanged")] > > > > > /** > > > > > * The index of the currently selected item. > > > Changing > > > > this > > > > > value > > > > > * also changes the selectedItem property. > > > > > @@ -216,7 +216,7 @@ package org.apache.royale.jewel > > > > > } > > > > > } > > > > > > > > > > - [Bindable("change")] > > > > > + [Bindable("selectionChanged")] > > > > > /** > > > > > * The item currently selected. Changing this > > > value > > > > also > > > > > * changes the selectedIndex property. > > > > > @@ -297,13 +297,9 @@ package org.apache.royale.jewel > > > > > var ddModel:IDropDownListModel = model as > > > > > IDropDownListModel; > > > > > if (ddModel) { > > > > > index -= ddModel.offset; > > > > > - > > > ddModel.setProcessingInteractiveChange(true); > > > > > } > > > > > > > > > > model.selectedIndex = index; > > > > > - > > > > > - if (ddModel) > > > > > - > > > ddModel.setProcessingInteractiveChange(false); > > > > > } > > > > > } > > > > > } > > > > > diff --git > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as > > > > > index 14fb311..ad495e5 100644 > > > > > --- > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as > > > > > +++ > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/List.as > > > > > @@ -24,9 +24,6 @@ package org.apache.royale.jewel > > > > > import org.apache.royale.core.IDataProviderModel; > > > > > import > org.apache.royale.core.IListPresentationModel; > > > > > import > > > > org.apache.royale.jewel.beads.models.ListPresentationModel; > > > > > - import > > > > org.apache.royale.jewel.beads.models.IJewelSelectionModel; > > > > > - import org.apache.royale.events.IEventDispatcher; > > > > > - import org.apache.royale.events.Event; > > > > > > > > > > COMPILE::JS > > > > > { > > > > > @@ -140,7 +137,7 @@ package org.apache.royale.jewel > > > > > * @productversion Royale 0.9.4 > > > > > * @royaleignorecoercion > > > > > org.apache.royale.core.ISelectionModel > > > > > */ > > > > > - [Bindable("change")] > > > > > + [Bindable("selectionChanged")] > > > > > public function get selectedIndex():int > > > > > { > > > > > return > > > ISelectionModel(model).selectedIndex; > > > > > @@ -201,7 +198,7 @@ package org.apache.royale.jewel > > > > > * @productversion Royale 0.9.4 > > > > > * @royaleignorecoercion > > > > > org.apache.royale.core.ISelectionModel > > > > > */ > > > > > - [Bindable("change")] > > > > > + [Bindable("selectionChanged")] > > > > > public function get selectedItem():Object > > > > > { > > > > > return > > > ISelectionModel(model).selectedItem; > > > > > @@ -232,5 +229,7 @@ package org.apache.royale.jewel > > > > > } > > > > > return presModel; > > > > > } > > > > > + > > > > > + > > > > > } > > > > > } > > > > > diff --git > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as > > > > > index cf187c3..b1fe20d 100644 > > > > > --- > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as > > > > > +++ > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ComboBoxController.as > > > > > @@ -18,7 +18,9 @@ > > > > > > > > > > > > > > > > > > > > //////////////////////////////////////////////////////////////////////////////// > > > > > package org.apache.royale.jewel.beads.controllers > > > > > { > > > > > - COMPILE::SWF > > > > > +import > > > > org.apache.royale.jewel.beads.models.IJewelSelectionModel; > > > > > + > > > > > +COMPILE::SWF > > > > > { > > > > > import flash.utils.setTimeout; > > > > > } > > > > > @@ -83,6 +85,13 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > } else { > > > > > > > > > > IEventDispatcher(_strand).addEventListener("viewChanged", > > > > finishSetup); > > > > > } > > > > > + if (model is IJewelSelectionModel) > { > > > > > + > IJewelSelectionModel(model).dispatcher = > > > > > IEventDispatcher(value); > > > > > + } > > > > > + else { > > > > > + > > > > > > > IEventDispatcher(model).addEventListener('dataProviderChanged', > > > > > modelChangeHandler); > > > > > + > > > > > > IEventDispatcher(model).addEventListener('selectionChanged', > > > > > modelChangeHandler); > > > > > + } > > > > > } > > > > > > > > > > /** > > > > > @@ -124,6 +133,11 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > list = (popup.view as > > > > ComboBoxPopUpView).list; > > > > > > > > list.addEventListener(MouseEvent.MOUSE_DOWN, > > > > > handleControlMouseDown); > > > > > list.addEventListener(Event.CHANGE, > > > > changeHandler); > > > > > + if (model is IJewelSelectionModel) { > > > > > + //don't let the pop-up's > list > > > take > > > > over as > > > > > primary dispatcher > > > > > + //it needs to stay with the > > > ComboBox > > > > (for > > > > > selection bindings to work) > > > > > + > IJewelSelectionModel(model).dispatcher = > > > > > IEventDispatcher(_strand); > > > > > + } > > > > > } > > > > > > > > > > private var popup:ComboBoxPopUp; > > > > > @@ -180,5 +194,9 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > > > > > > > > > IEventDispatcher(_strand).dispatchEvent(new > > > > > Event(Event.CHANGE)); > > > > > } > > > > > + > > > > > + protected function > > > modelChangeHandler(event:Event):void{ > > > > > + > IEventDispatcher(_strand).dispatchEvent(new > > > > > Event(event.type)); > > > > > + } > > > > > } > > > > > } > > > > > diff --git > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as > > > > > index 62d4896..1bddf92 100644 > > > > > --- > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as > > > > > +++ > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/DropDownListController.as > > > > > @@ -20,7 +20,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > { > > > > > // import flash.display.DisplayObject; > > > > > // import flash.geom.Point; > > > > > - > > > > > + > > > > > import org.apache.royale.core.IBeadController; > > > > > import org.apache.royale.core.IStrand; > > > > > import org.apache.royale.events.Event; > > > > > @@ -29,7 +29,8 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > import org.apache.royale.events.ItemClickedEvent; > > > > > import org.apache.royale.events.ItemRemovedEvent; > > > > > import > > > > org.apache.royale.jewel.beads.models.DropDownListModel; > > > > > - import > > > org.apache.royale.jewel.beads.views.DropDownListView; > > > > > +import > > > > org.apache.royale.jewel.beads.models.IJewelSelectionModel; > > > > > +import > > > org.apache.royale.jewel.beads.views.DropDownListView; > > > > > > > > > > /** > > > > > * The DropDownListController class is the > > > controller for > > > > > @@ -39,7 +40,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > * This controller watches for the click event > and > > > > displays the > > > > > * dropdown/popup, and watches the dropdown/popup > > for > > > > change > > > > > events > > > > > * and updates the selection model accordingly. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -49,7 +50,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > { > > > > > /** > > > > > * Constructor. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -58,10 +59,10 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > public function DropDownListController() > > > > > { > > > > > } > > > > > - > > > > > + > > > > > /** > > > > > * The model. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -71,7 +72,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > > > > > > /** > > > > > * The view. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -82,11 +83,12 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > private var _strand:IStrand; > > > > > /** > > > > > * @copy org.apache.royale.core.IBead#strand > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > * @productversion Royale 0.9.4 > > > > > + * @royaleignorecoercion > > > > > org.apache.royale.events.IEventDispatcher > > > > > */ > > > > > public function set > > strand(value:IStrand):void > > > > > { > > > > > @@ -94,7 +96,14 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > model = > > > value.getBeadByType(DropDownListModel) as > > > > > DropDownListModel; > > > > > > > > > IEventDispatcher(_strand).addEventListener("itemAdded", > > > > > handleItemAdded); > > > > > > > > > > IEventDispatcher(_strand).addEventListener("itemRemoved", > > > > > handleItemRemoved); > > > > > - > > > > > > > > > > > > > > > //IEventDispatcher(value).addEventListener(org.apache.royale.events.MouseEvent.CLICK, > > > > > clickHandler); > > > > > + if (model is IJewelSelectionModel) { > > > > > + IJewelSelectionModel(model).dispatcher > > = > > > > > IEventDispatcher(value); > > > > > + } > > > > > + else { > > > > > + > > > > > > IEventDispatcher(model).addEventListener('selectionChanged', > > > > > modelChangeHandler); > > > > > + > > > > > > > IEventDispatcher(model).addEventListener('dataProviderChanged', > > > > > modelChangeHandler); > > > > > + } > > > > > + > > > > > } > > > > > > > > > > /** > > > > > @@ -104,7 +113,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > { > > > > > > > > > > > IEventDispatcher(event.item).addEventListener("itemClicked", > > > > > selectedHandler); > > > > > } > > > > > - > > > > > + > > > > > /** > > > > > * @royaleignorecoercion > > > > > org.apache.royale.events.IEventDispatcher > > > > > */ > > > > > @@ -119,7 +128,11 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > model.selectedItem = event.data; > > > > > view.host.dispatchEvent(new > > > Event(Event.CHANGE)); > > > > > } > > > > > - > > > > > + > > > > > + protected function > > > > modelChangeHandler(event:Event):void{ > > > > > + > > > IEventDispatcher(_strand).dispatchEvent(new > > > > > Event(event.type)); > > > > > + } > > > > > + > > > > > // private function > > > > > > clickHandler(event:org.apache.royale.events.MouseEvent):void > > > > > // { > > > > > // var viewBead:IDropDownListView = > > > > > _strand.getBeadByType(IDropDownListView) as > > IDropDownListView; > > > > > @@ -137,16 +150,16 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > // > > > > > > > > IEventDispatcher(viewBead.popUp).addEventListener(Event.CHANGE, > > > > > changeHandler); > > > > > // > > > > > > > > > > > > > > > IUIBase(_strand).topMostEventDispatcher.addEventListener(org.apache.royale.events.MouseEvent.CLICK, > > > > > dismissHandler); > > > > > // } > > > > > - > > > > > + > > > > > // private function > > > > > > > dismissHandler(event:org.apache.royale.events.MouseEvent):void > > > > > // { > > > > > // if (event.target == _strand) return; > > > > > - > > > > > + > > > > > // > > > > > > > > > > > > > > > IUIBase(_strand).topMostEventDispatcher.removeEventListener(org.apache.royale.events.MouseEvent.CLICK, > > > > > dismissHandler); > > > > > // var viewBead:IDropDownListView = > > > > > _strand.getBeadByType(IDropDownListView) as > > IDropDownListView; > > > > > // viewBead.popUpVisible = false; > > > > > // } > > > > > - > > > > > + > > > > > // private function > > > changeHandler(event:Event):void > > > > > // { > > > > > // var viewBead:IDropDownListView = > > > > > _strand.getBeadByType(IDropDownListView) as > > IDropDownListView; > > > > > @@ -156,6 +169,6 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > // selectionModel.selectedIndex = > > > > > popUpModel.selectedIndex; > > > > > // > > > IEventDispatcher(_strand).dispatchEvent(new > > > > > Event(Event.CHANGE)); > > > > > // } > > > > > - > > > > > + > > > > > } > > > > > } > > > > > diff --git > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > > > > > ller.as > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > > > > > ller.as > > > > > index c19ce5f..604b55e 100644 > > > > > --- > > > > > > > > > > > > > > > a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > > > > > ller.as > > > > > +++ > > > > > > > > > > > > > > > b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controllers/ListSingleSelectionMouseContro > > > > > ller.as > > > > > @@ -30,8 +30,9 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > import org.apache.royale.events.ItemClickedEvent; > > > > > import org.apache.royale.events.ItemRemovedEvent; > > > > > import org.apache.royale.html.beads.IListView; > > > > > +import > > > > org.apache.royale.jewel.beads.models.IJewelSelectionModel; > > > > > > > > > > - /** > > > > > +/** > > > > > * The ListSingleSelectionMouseController class > is > > a > > > > controller > > > > > for > > > > > * org.apache.royale.jewel.List. Controllers > > > > > * watch for events from the interactive portions > > of > > > a > > > > View and > > > > > @@ -40,7 +41,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > * and updates an ISelectionModel (which only > > > supports > > > > single > > > > > * selection). Other controller/model pairs > would > > > support > > > > > * various kinds of multiple selection. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -50,7 +51,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > { > > > > > /** > > > > > * Constructor. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -59,10 +60,10 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > public function > > > ListSingleSelectionMouseController() > > > > > { > > > > > } > > > > > - > > > > > + > > > > > /** > > > > > * The model. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -72,7 +73,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > > > > > > /** > > > > > * The view. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -82,7 +83,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > > > > > > /** > > > > > * The parent of the item renderers. > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -91,10 +92,10 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > protected var dataGroup:IItemRendererParent; > > > > > > > > > > private var _strand:IStrand; > > > > > - > > > > > + > > > > > /** > > > > > * @copy org.apache.royale.core.IBead#strand > > > > > - * > > > > > + * > > > > > * @langversion 3.0 > > > > > * @playerversion Flash 10.2 > > > > > * @playerversion AIR 2.6 > > > > > @@ -110,8 +111,15 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > listView = > > > value.getBeadByType(IListView) as > > > > > IListView; > > > > > > > > > > IEventDispatcher(_strand).addEventListener("itemAdded", > > > > handleItemAdded); > > > > > > > > > > IEventDispatcher(_strand).addEventListener("itemRemoved", > > > > > handleItemRemoved); > > > > > + if (listModel is > > IJewelSelectionModel) > > > { > > > > > + > > > IJewelSelectionModel(listModel).dispatcher = > > > > > IEventDispatcher(value); > > > > > + } > > > > > + else { > > > > > + > > > > > > > > IEventDispatcher(listModel).addEventListener('selectionChanged', > > > > > modelChangeHandler); > > > > > + > > > > > > > > IEventDispatcher(listModel).addEventListener('dataProviderChanged', > > > > > modelChangeHandler); > > > > > + } > > > > > } > > > > > - > > > > > + > > > > > /** > > > > > * @royaleignorecoercion > > > > > org.apache.royale.events.IEventDispatcher > > > > > */ > > > > > @@ -121,7 +129,7 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > > > > > > > IEventDispatcher(event.item).addEventListener("itemRollOver", > > > > > rolloverHandler); > > > > > > > > > > > IEventDispatcher(event.item).addEventListener("itemRollOut", > > > > > rolloutHandler); > > > > > } > > > > > - > > > > > + > > > > > /** > > > > > * @royaleignorecoercion > > > > > org.apache.royale.events.IEventDispatcher > > > > > */ > > > > > @@ -131,14 +139,18 @@ package > > > > org.apache.royale.jewel.beads.controllers > > > > > > > > > > > > > IEventDispatcher(event.item).removeEventListener("itemRollOver", > > > > > rolloverHandler); > > > > > > > > > > > > IEventDispatcher(event.item).removeEventListener("itemRollOut", > > > > > rolloutHandler); > > > > > } > > > > > - > > > > > + > > > > > protected function > > > > > selectedHandler(event:ItemClickedEvent):void > > > > > { > > > > > listModel.selectedIndex = event.index; > > > > > listModel.selectedItem = > event.data; > > > > > listView.host.dispatchEvent(new > > > > Event(Event.CHANGE)); > > > > > } > > > > > - > > > > > + > > > > > +
