This is an automated email from the ASF dual-hosted git repository. alinakazi pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
The following commit(s) were added to refs/heads/develop by this push: new 29d667a Multi SelectionList is added in mx emulation 29d667a is described below commit 29d667a826c9a5e69c46f06b552198ccaa2abe53 Author: alinakazi <alinakazi1...@gmail.com> AuthorDate: Fri Mar 12 22:39:17 2021 +0500 Multi SelectionList is added in mx emulation --- .../main/royale/mx/controls/MultiSelectionList.as | 159 ++++++++++++++ .../MultiSelectionItemRendererClassFactory.as | 65 ++++++ .../mx/controls/beads/MultiSelectionListView.as | 211 +++++++++++++++++++ .../ListMultiSelectionMouseController.as | 230 ++++++++++++++++++++ .../beads/models/ArrayMultiSelectionModel.as | 232 +++++++++++++++++++++ 5 files changed, 897 insertions(+) diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MultiSelectionList.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MultiSelectionList.as new file mode 100644 index 0000000..a03001a --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MultiSelectionList.as @@ -0,0 +1,159 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package mx.controls +{ + import org.apache.royale.core.IRollOverModel; + import org.apache.royale.core.IMultiSelectionModel; + import mx.controls.listClasses.ListBase; + import org.apache.royale.core.IListPresentationModel; + import org.apache.royale.core.IDataProviderModel; +import org.apache.royale.html.DataContainer; + COMPILE::JS + { + import org.apache.royale.core.WrappedHTMLElement; + } + + /** + * Indicates that the initialization of the list is complete. + * + * @toplevel + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + [Event(name="initComplete", type="org.apache.royale.events.Event")] + + /** + * The change event is dispatched whenever the list's selection changes. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + [Event(name="change", type="org.apache.royale.events.Event")] + + /** + * The MultiSelectionList class is a component that displays multiple data items. The MultiSelectionList uses + * the following bead types: + * + * org.apache.royale.core.IBeadModel: the data model, which includes the dataProvider, selectedItems, and + * so forth. + * org.apache.royale.core.IBeadView: the bead that constructs the visual parts of the list. + * org.apache.royale.core.IBeadController: the bead that handles input and output. + * org.apache.royale.core.IBeadLayout: the bead responsible for the size and position of the itemRenderers. + * org.apache.royale.core.IDataProviderItemRendererMapper: the bead responsible for creating the itemRenders. + * org.apache.royale.core.IItemRenderer: the class or factory used to display an item in the list. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public class MultiSelectionList extends DataContainer + { + /** + * constructor. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function MultiSelectionList() + { + super(); + typeNames += " MultiSelectionList"; + } + + /** + * The index of the currently selected item. Changing this value + * also changes the selectedItems property. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + * @royaleignorecoercion org.apache.royale.core.IMultiSelectionModel + */ + [Bindable("change")] + public function get selectedIndices():Array + { + return IMultiSelectionModel(model).selectedIndices; + } + + /** + * @royaleignorecoercion org.apache.royale.core.IMultiSelectionModel + */ + public function set selectedIndices(value:Array):void + { + IMultiSelectionModel(model).selectedIndices = value; + } + + /** + * The index of the item currently below the pointer. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + * @royaleignorecoercion org.apache.royale.core.IRollOverModel + */ + public function get rollOverIndex():int + { + return IRollOverModel(model).rollOverIndex; + } + + /** + * @royaleignorecoercion org.apache.royale.core.IRollOverModel + */ + public function set rollOverIndex(value:int):void + { + IRollOverModel(model).rollOverIndex = value; + } + + + /** + * The items currently selected. Changing this value also + * changes the selectedIndices property. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + * @royaleignorecoercion org.apache.royale.core.IMultiSelectionModel + */ + [Bindable("change")] + public function get selectedItems():Array + { + return IMultiSelectionModel(model).selectedItems; + } + + /** + * @royaleignorecoercion org.apache.royale.core.IMultiSelectionModel + */ + public function set selectedItems(value:Array):void + { + IMultiSelectionModel(model).selectedItems = value; + } + + + } +} diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionItemRendererClassFactory.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionItemRendererClassFactory.as new file mode 100644 index 0000000..737d3b4 --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionItemRendererClassFactory.as @@ -0,0 +1,65 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package mx.controls.beads +{ + /** + * The MultiSelectionItemRendererClassFactory class extends ItemRendererClassFactory to add a multiselection controller to item renderers + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + import org.apache.royale.core.IBeadController; + import org.apache.royale.core.IItemRendererOwnerView; + import org.apache.royale.core.IBead; + import org.apache.royale.core.ItemRendererClassFactory; + import org.apache.royale.core.IItemRenderer; + import org.apache.royale.core.IStrand; + import org.apache.royale.html.beads.controllers.MultiSelectionItemRendererMouseController; + + public class MultiSelectionItemRendererClassFactory extends ItemRendererClassFactory + { + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function MultiSelectionItemRendererClassFactory() + { + super(); + } + + override public function createFromClass():IItemRenderer + { + var renderer:IItemRenderer = super.createFromClass(); + var strand:IStrand = renderer as IStrand; + var bead:IBead = strand.getBeadByType(IBeadController); + if (bead) + { + strand.removeBead(bead); + } + strand.addBead(new MultiSelectionItemRendererMouseController()); + return renderer; + } + } +} diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionListView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionListView.as new file mode 100644 index 0000000..ac31a25 --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionListView.as @@ -0,0 +1,211 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package mx.controls.beads +{ + import org.apache.royale.html.beads.DataContainerView; + import org.apache.royale.core.BeadViewBase; + import org.apache.royale.core.ContainerBase; + import org.apache.royale.core.IBead; + import org.apache.royale.core.IBeadLayout; + import org.apache.royale.core.IBeadModel; + import org.apache.royale.core.IBeadView; + import org.apache.royale.core.ISelectableItemRenderer; + import org.apache.royale.core.IItemRenderer; + import org.apache.royale.core.IItemRendererOwnerView; + import org.apache.royale.core.IParent; + import org.apache.royale.core.IParentIUIBase; + import org.apache.royale.core.IRollOverModel; + import org.apache.royale.core.IMultiSelectionModel; + import org.apache.royale.core.IStrand; + import org.apache.royale.core.IUIBase; + import org.apache.royale.core.Strand; + import org.apache.royale.core.UIBase; + import org.apache.royale.core.ValuesManager; + import org.apache.royale.events.Event; + import org.apache.royale.events.IEventDispatcher; + import org.apache.royale.html.supportClasses.Border; + import org.apache.royale.html.supportClasses.DataGroup; + + /** + * The List class creates the visual elements of the org.apache.royale.html.List + * component. A List consists of the area to display the data (in the dataGroup), any + * scrollbars, and so forth. + * + * @viewbead + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + COMPILE::JS + public class MultiSelectionListView extends DataContainerView + { + public function MultiSelectionListView() + { + super(); + } + + protected var listModel:IMultiSelectionModel; + + protected var lastSelectedIndices:Array = null; + + /** + * @private + * @royaleignorecoercion org.apache.royale.core.IMultiSelectionModel + */ + override protected function handleInitComplete(event:Event):void + { + listModel = _strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel; + listModel.addEventListener("selectedIndicesChanged", selectionChangeHandler); + listModel.addEventListener("rollOverIndexChanged", rollOverIndexChangeHandler); + + + super.handleInitComplete(event); + } + + /** + * @private + * @royaleignorecoercion org.apache.royale.core.ISelectableItemRenderer + */ + protected function selectionChangeHandler(event:Event):void + { + if (lastSelectedIndices) + { + for (var i:int = 0; i < lastSelectedIndices.length; i++) + { + var ir:ISelectableItemRenderer = dataGroup.getItemRendererForIndex(lastSelectedIndices[i]) as ISelectableItemRenderer; + if(ir) + ir.selected = false; + } + } + if (listModel.selectedIndices) + { + for (i = 0; i < listModel.selectedIndices.length; i++) + { + ir = dataGroup.getItemRendererForIndex(listModel.selectedIndices[i]) as ISelectableItemRenderer; + if(ir) + ir.selected = true; + } + } + + lastSelectedIndices = listModel.selectedIndices; + } + + protected var lastRollOverIndex:int = -1; + + /** + * @private + * @royaleignorecoercion org.apache.royale.core.ISelectableItemRenderer + * * @royaleignorecoercion org.apache.royale.core.IRollOverModel + */ + protected function rollOverIndexChangeHandler(event:Event):void + { + var ir:ISelectableItemRenderer = dataGroup.getItemRendererForIndex(lastRollOverIndex) as ISelectableItemRenderer; + if(ir) + ir.hovered = false; + ir = dataGroup.getItemRendererForIndex((listModel as IRollOverModel).rollOverIndex) as ISelectableItemRenderer; + if(ir) + ir.hovered = true; + lastRollOverIndex = (listModel as IRollOverModel).rollOverIndex; + } + } + + COMPILE::SWF + public class MultiSelectionListView extends DataContainerView + { + public function MultiSelectionListView() + { + super(); + } + + protected var listModel:IMultiSelectionModel; + + /** + * @copy org.apache.royale.core.IBead#strand + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + override public function set strand(value:IStrand):void + { + _strand = value; + super.strand = value; + } + + /** + * @private + */ + override protected function handleInitComplete(event:Event):void + { + super.handleInitComplete(event); + + listModel = _strand.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel; + listModel.addEventListener("selectedIndicesChanged", selectionChangeHandler); + listModel.addEventListener("rollOverIndexChanged", rollOverIndexChangeHandler); + } + + protected var lastSelectedIndices:Array = null; + + /** + * @private + */ + protected function selectionChangeHandler(event:Event):void + { + + if (lastSelectedIndices) + { + for (var i:int = 0; i < lastSelectedIndices.length; i++) + { + var ir:ISelectableItemRenderer = dataGroup.getItemRendererForIndex(lastSelectedIndices[i]) as ISelectableItemRenderer; + if (ir) + ir.selected = false; + } + } + if (listModel.selectedIndices) + { + for (i = 0; i < listModel.selectedIndices; i++) + { + ir = dataGroup.getItemRendererForIndex(listModel.selectedIndices[i]) as ISelectableItemRenderer; + if (ir) + ir.selected = true; + } + } + lastSelectedIndices = listModel.selectedIndices; + } + + protected var lastRollOverIndex:int = -1; + + /** + * @private + */ + protected function rollOverIndexChangeHandler(event:Event):void + { + var ir:ISelectableItemRenderer = dataGroup.getItemRendererForIndex(lastRollOverIndex) as ISelectableItemRenderer; + if(ir) + ir.hovered = false; + ir = dataGroup.getItemRendererForIndex(IRollOverModel(listModel).rollOverIndex) as ISelectableItemRenderer; + if(ir) + ir.hovered = true; + + lastRollOverIndex = IRollOverModel(listModel).rollOverIndex; + } + } +} diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/controllers/ListMultiSelectionMouseController.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/controllers/ListMultiSelectionMouseController.as new file mode 100644 index 0000000..376f55b --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/controllers/ListMultiSelectionMouseController.as @@ -0,0 +1,230 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package mx.controls.beads.controllers +{ + import org.apache.royale.core.IBeadController; + import org.apache.royale.core.IIndexedItemRenderer; + import org.apache.royale.core.IItemRendererOwnerView; + import org.apache.royale.core.IMultiSelectionModel; + import org.apache.royale.core.IRollOverModel; + import org.apache.royale.core.ISelectableItemRenderer; + import org.apache.royale.core.IStrand; + import org.apache.royale.events.Event; + import org.apache.royale.events.IEventDispatcher; + import org.apache.royale.events.ItemAddedEvent; + import org.apache.royale.events.ItemRemovedEvent; + import org.apache.royale.events.MultiSelectionItemClickedEvent; + import org.apache.royale.html.beads.IListView; + import org.apache.royale.utils.getSelectionRenderBead; + import org.apache.royale.utils.sendEvent; + import org.apache.royale.core.Bead; + + /** + * The ListMultiSelectionMouseController class is a controller for + * org.apache.royale.html.List. Controllers + * watch for events from the interactive portions of a View and + * update the data model or dispatch a semantic event. + * This controller watches for events from the item renderers + * and updates an IMultiSelectionModel (which supports multi + * selection). + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public class ListMultiSelectionMouseController extends Bead implements IBeadController + { + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function ListMultiSelectionMouseController() + { + } + + /** + * The model. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + protected var listModel:IMultiSelectionModel; + + /** + * The view. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + protected var listView:IListView; + + /** + * The parent of the item renderers. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + protected var dataGroup:IItemRendererOwnerView; + + + /** + * @copy org.apache.royale.core.IBead#strand + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + * @royaleignorecoercion org.apache.royale.core.IMultiSelectionModel + * @royaleignorecoercion org.apache.royale.html.beads.IListView + */ + override public function set strand(value:IStrand):void + { + _strand = value; + listModel = value.getBeadByType(IMultiSelectionModel) as IMultiSelectionModel; + listView = value.getBeadByType(IListView) as IListView; + listenOnStrand("itemAdded", handleItemAdded); + listenOnStrand("itemRemoved", handleItemRemoved); + } + + /** + * @royaleignorecoercion org.apache.royale.events.IEventDispatcher + */ + protected function handleItemAdded(event:ItemAddedEvent):void + { + IEventDispatcher(event.item).addEventListener("itemClicked", selectedHandler); + IEventDispatcher(event.item).addEventListener("itemRollOver", rolloverHandler); + IEventDispatcher(event.item).addEventListener("itemRollOut", rolloutHandler); + } + + /** + * @royaleignorecoercion org.apache.royale.events.IEventDispatcher + */ + protected function handleItemRemoved(event:ItemRemovedEvent):void + { + IEventDispatcher(event.item).removeEventListener("itemClicked", selectedHandler); + IEventDispatcher(event.item).removeEventListener("itemRollOver", rolloverHandler); + IEventDispatcher(event.item).removeEventListener("itemRollOut", rolloutHandler); + } + + protected function selectedHandler(event:MultiSelectionItemClickedEvent):void + { + var selectedIndices:Array = []; + var newIndices:Array; + if (!(event.ctrlKey || event.shiftKey) || !listModel.selectedIndices || listModel.selectedIndices.length == 0) + { + newIndices = [event.index]; + } else if (event.ctrlKey) + { + // concat is so we have a new instance, avoiding code that might presume no change was made according to instance + newIndices = listModel.selectedIndices.concat(); + var locationInSelectionList:int = newIndices.indexOf(event.index); + if (locationInSelectionList < 0) + { + newIndices.push(event.index); + } else + { + newIndices.removeAt(locationInSelectionList); + } + } else if (event.shiftKey) + { + newIndices = []; + var min:int = getMin(listModel.selectedIndices); + var max:int = getMax(listModel.selectedIndices); + var from:int = Math.min(min, event.index); + var to:int = event.index > min ? event.index : min; + while (from <= to) + { + newIndices.push(from++); + } + } + listModel.selectedIndices = newIndices; + sendEvent(listView.host,"change"); + } + + private function getMin(value:Array):int + { + var result:int = int(value[0]); + for (var i:int = 0; i < value.length; i++) + { + if (value[i] < result) + { + result = value[i]; + } + } + return result; + } + + private function getMax(value:Array):int + { + var result:int = int(value[0]); + for (var i:int = 0; i < value.length; i++) + { + if (value[i] > result) + { + result = value[i]; + } + } + return result; + } + + /** + * @royaleemitcoercion org.apache.royale.core.IIndexedItemRenderer + * @royaleignorecoercion org.apache.royale.core.IRollOverModel + */ + protected function rolloverHandler(event:Event):void + { + var renderer:IIndexedItemRenderer = event.currentTarget as IIndexedItemRenderer; + if (renderer) { + IRollOverModel(listModel).rollOverIndex = renderer.index; + } + } + + /** + * @royaleemitcoercion org.apache.royale.core.IIndexedItemRenderer + * @royaleignorecoercion org.apache.royale.core.IRollOverModel + */ + protected function rolloutHandler(event:Event):void + { + var renderer:IIndexedItemRenderer = event.currentTarget as IIndexedItemRenderer; + if (renderer) { + if (renderer is IStrand) + { + var selectionBead:ISelectableItemRenderer = getSelectionRenderBead(renderer); + if (selectionBead) + { + selectionBead.hovered = false; + selectionBead.down = false; + } + } + IRollOverModel(listModel).rollOverIndex = -1; + } + } + } +} diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/ArrayMultiSelectionModel.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/ArrayMultiSelectionModel.as new file mode 100644 index 0000000..339204d --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/ArrayMultiSelectionModel.as @@ -0,0 +1,232 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package mx.controls.beads.models +{ + import org.apache.royale.core.IRollOverModel; + import org.apache.royale.core.IMultiSelectionModel; + import org.apache.royale.core.IStrand; + import org.apache.royale.events.Event; + import org.apache.royale.events.EventDispatcher; + /** + * The ArrayMultiSelectionModel class is a selection model for + * a dataProvider that is an array. It assumes that items + * can be fetched from the dataProvider + * dataProvider[index]. Other selection models + * would support other kinds of data providers. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion 0.9.7 + */ + + public class ArrayMultiSelectionModel extends EventDispatcher implements IMultiSelectionModel, IRollOverModel + { + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function ArrayMultiSelectionModel() + { + } + + 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.7 + */ + public function set strand(value:IStrand):void + { + _strand = value; + } + + private var _dataProvider:Object; + + /** + * @copy org.apache.royale.core.IMultiSelectionModel#dataProvider + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function get dataProvider():Object + { + return _dataProvider; + } + + /** + * @private + */ + public function set dataProvider(value:Object):void + { + if (value == _dataProvider) return; + _dataProvider = value; + if(_dataProvider && _selectedIndices) + { + var indices:Array = []; + var length:int = (value as Array).length; + for (var i:int = 0; i < _selectedIndices.length; i++) + { + if (_selectedIndices[i] < length) + { + indices.push(value[_selectedIndices[i]]); + } + _selectedIndices = indices; + syncItemsAndIndices(); + } + } + dispatchEvent(new Event("dataProviderChanged")); + } + + private var _selectedIndices:Array = null; + private var _rollOverIndex:int = -1; + private var _labelField:String = null; + + /** + * @copy org.apache.royale.core.IMultiSelectionModel#labelField + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function get labelField():String + { + return _labelField; + } + + /** + * @private + */ + public function set labelField(value:String):void + { + if (value != _labelField) { + _labelField = value; + dispatchEvent(new Event("labelFieldChanged")); + } + } + + /** + * @copy org.apache.royale.core.IMultiSelectionModel#selectedIndices + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function get selectedIndices():Array + { + return _selectedIndices; + } + + /** + * @private + */ + public function set selectedIndices(value:Array):void + { + if (value == _selectedIndices) return; + _selectedIndices = value; + if (value == null || dataProvider == null) + { + _selectedItems = null; + } else + { + syncItemsAndIndices(); + } + dispatchEvent(new Event("selectedItemsChanged")); + dispatchEvent(new Event("selectedIndicesChanged")); + } + + /** + * @copy org.apache.royale.core.IRollOverModel#rollOverIndex + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function get rollOverIndex():int + { + return _rollOverIndex; + } + + /** + * @private + */ + public function set rollOverIndex(value:int):void + { + _rollOverIndex = value; + dispatchEvent(new Event("rollOverIndexChanged")); + } + + private var _selectedItems:Array; + + /** + * @copy org.apache.royale.core.IMultiSelectionModel#selectedItems + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.9.7 + */ + public function get selectedItems():Array + { + return _selectedItems; + } + + /** + * @private + */ + public function set selectedItems(value:Array):void + { + if (value == _selectedItems) return; + + _selectedItems = value; + _selectedIndices = []; + var dp:Array = _dataProvider as Array; + for (var i:int = 0; i < value.length; i++) + { + _selectedIndices.push(dp.indexOf(value[i])); + } + dispatchEvent(new Event("selectedItemsChanged")); + dispatchEvent(new Event("selectedIndicesChanged")); + } + + + private function syncItemsAndIndices():void + { + var items:Array = []; + for (var i:int = 0; i < _selectedIndices.length; i++) + { + items.push(dataProvider[_selectedIndices[i]]); + } + _selectedItems = items; + } + } +}