This is an automated email from the ASF dual-hosted git repository. aharui pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit 56233b20ba864cb215e0273600fa97325c7434cb Author: Alex Harui <aha...@apache.org> AuthorDate: Tue Dec 4 14:46:02 2018 -0800 Spark DropDownList --- .../SparkRoyale/src/main/resources/defaults.css | 7 + .../src/main/royale/SparkRoyaleClasses.as | 2 + .../main/royale/spark/components/DropDownList.as | 31 ++++ .../spark/components/beads/DropDownListView.as | 176 +++++++++++++++++++++ .../beads/controllers/DropDownListController.as | 111 +++++++++++++ .../components/supportClasses/DropDownListBase.as | 21 +-- 6 files changed, 339 insertions(+), 9 deletions(-) diff --git a/frameworks/projects/SparkRoyale/src/main/resources/defaults.css b/frameworks/projects/SparkRoyale/src/main/resources/defaults.css index ddde944..9e93095 100644 --- a/frameworks/projects/SparkRoyale/src/main/resources/defaults.css +++ b/frameworks/projects/SparkRoyale/src/main/resources/defaults.css @@ -78,6 +78,13 @@ DataGroup IViewportModel: ClassReference("org.apache.royale.html.beads.models.ViewportModel"); } +DropDownList +{ + IBeadModel: ClassReference("mx.controls.beads.models.SingleSelectionICollectionViewModel"); + IBeadView: ClassReference("spark.components.beads.DropDownListView"); + IBeadController: ClassReference("spark.components.beads.controllers.DropDownListController"); +} + List { IBeadView: ClassReference("spark.components.beads.SkinnableContainerView"); diff --git a/frameworks/projects/SparkRoyale/src/main/royale/SparkRoyaleClasses.as b/frameworks/projects/SparkRoyale/src/main/royale/SparkRoyaleClasses.as index 4dc8cee..d9f4357 100644 --- a/frameworks/projects/SparkRoyale/src/main/royale/SparkRoyaleClasses.as +++ b/frameworks/projects/SparkRoyale/src/main/royale/SparkRoyaleClasses.as @@ -76,6 +76,8 @@ internal class SparkRoyaleClasses import spark.components.beads.PanelView; PanelView; import spark.components.beads.SkinnableContainerView; SkinnableContainerView; + import spark.components.beads.DropDownListView; DropDownListView; + import spark.components.beads.controllers.DropDownListController; DropDownListController; } diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DropDownList.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DropDownList.as index ffea061..f17a8bd 100644 --- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DropDownList.as +++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DropDownList.as @@ -32,6 +32,7 @@ import spark.utils.LabelUtil; */ import spark.components.supportClasses.DropDownListBase; + import spark.components.beads.DropDownListView; //-------------------------------------- @@ -379,5 +380,35 @@ public class DropDownList extends DropDownListBase labelDisplay.text = prompt; } } */ + + /** + * @private + * Because DropDown extends List which overrides numChildren to point to + * the DataGroup, the default measurement code will be incorrect + * + * @royaleignorecoercion spark.components.beads.DropDownListView + */ + override public function get measuredWidth():Number + { + var mw:Number = super.measuredWidth; + if (mw == 0) + mw = (view as DropDownListView).label.measuredWidth; + return mw; + } + + /** + * @private + * Because DropDown extends List which overrides numChildren to point to + * the DataGroup, the default measurement code will be incorrect + * + * @royaleignorecoercion spark.components.beads.DropDownListView + */ + override public function get measuredHeight():Number + { + var mh:Number = super.measuredHeight; + if (mh == 0) + mh = (view as DropDownListView).label.measuredHeight; + return mh; + } } } \ No newline at end of file diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/beads/DropDownListView.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/beads/DropDownListView.as new file mode 100644 index 0000000..b0a2ee1 --- /dev/null +++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/beads/DropDownListView.as @@ -0,0 +1,176 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 spark.components.beads +{ + +import mx.core.IFlexDisplayObject; +import mx.core.IUIComponent; +import mx.managers.PopUpManager; + +import spark.components.Button; +import spark.components.DropDownList; + +import org.apache.royale.core.IBead; +import org.apache.royale.core.IChild; +import org.apache.royale.core.IContainer; +import org.apache.royale.core.ILayoutChild; +import org.apache.royale.core.IPopUpHost; +import org.apache.royale.core.ISelectionModel; +import org.apache.royale.core.IStrand; +import org.apache.royale.core.IStrandWithModel; +import org.apache.royale.core.IUIBase; +import org.apache.royale.events.Event; +import org.apache.royale.html.beads.IDropDownListView; + +/** + * @private + * The SkinnableContainerView for emulation. + */ +public class DropDownListView extends SkinnableContainerView implements IDropDownListView +{ + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function DropDownListView() + { + super(); + } + + public var label:Button; + + private var selectionModel:ISelectionModel; + + /** + */ + override public function set strand(value:IStrand):void + { + super.strand = value; + + selectionModel = (value as IStrandWithModel).model as ISelectionModel; + selectionModel.addEventListener("selectedIndexChanged", selectionChangeHandler); + selectionModel.addEventListener("dataProviderChanged", selectionChangeHandler); + + // remove the DataGroup. It will be the dropdown + var chost:IContainer = host as IContainer; + chost.strandChildren.removeElement(viewport.contentView); + + label = new Button(); + if (selectionModel.selectedIndex == -1) + label.label = (host as DropDownList).prompt; + chost.strandChildren.addElement(label); + + + value.addBead(new DropDownListLayout()); + + } + + private function selectionChangeHandler(event:Event):void + { + if (selectionModel.selectedItem == null) + label.label = (host as DropDownList).prompt; + else if (selectionModel.labelField != null) + label.label = selectionModel.selectedItem[selectionModel.labelField].toString(); + else + label.label = selectionModel.selectedItem.toString(); + } + + /** + * The dropdown/popup that displays the set of choices. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.0 + */ + public function get popUp():IStrand + { + return viewport.contentView as IStrand; + } + + private var _popUpVisible:Boolean; + + /** + * A flag that indicates whether the dropdown/popup is + * visible. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.0 + */ + public function get popUpVisible():Boolean + { + return _popUpVisible; + } + + /** + * @private + */ + public function set popUpVisible(value:Boolean):void + { + if (value != _popUpVisible) + { + _popUpVisible = value; + if (value) + { + PopUpManager.addPopUp(popUp as IFlexDisplayObject, _strand); + (popUp as IUIComponent).setActualSize((popUp as IUIComponent).width, 100); + } + else + { + PopUpManager.removePopUp(popUp as IFlexDisplayObject); + } + } + } +} + +} + +import spark.components.Button; +import spark.components.DropDownList; +import spark.components.beads.DropDownListView; + +import org.apache.royale.core.LayoutBase; + +// this layouts out the one Label/Button. +class DropDownListLayout extends LayoutBase +{ + override public function layout():Boolean + { + var list:DropDownList = host as DropDownList; + var view:DropDownListView = list.view as DropDownListView; + view.label.setActualSize(list.width, list.height); + + return false; + } +} + + diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/beads/controllers/DropDownListController.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/beads/controllers/DropDownListController.as new file mode 100644 index 0000000..ffddb69 --- /dev/null +++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/beads/controllers/DropDownListController.as @@ -0,0 +1,111 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 spark.components.beads.controllers +{ + + +import org.apache.royale.core.IBead; +import org.apache.royale.core.IBeadController; +import org.apache.royale.core.ISelectionModel; +import org.apache.royale.core.IStrand; +import org.apache.royale.core.IUIBase; +import org.apache.royale.core.UIBase; +import org.apache.royale.events.Event; +import org.apache.royale.events.IEventDispatcher; +import org.apache.royale.events.MouseEvent; +import org.apache.royale.html.beads.IDropDownListView; +import org.apache.royale.geom.Point; +import org.apache.royale.utils.PointUtils; +import org.apache.royale.events.MouseEvent; + +import mx.core.UIComponent; + +/** + * @private + * The controller for Spark Dropdownlist. + * + */ +public class DropDownListController implements IBead, IBeadController +{ + // NOTE: this is a copy of Basic DropDownListController but the Basic one is SWF-only + + + 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.0 + */ + public function set strand(value:IStrand):void + { + _strand = value; + IEventDispatcher(value).addEventListener(org.apache.royale.events.MouseEvent.CLICK, clickHandler); + } + + private function clickHandler(event:org.apache.royale.events.MouseEvent):void + { + var viewBead:IDropDownListView = _strand.getBeadByType(IDropDownListView) as IDropDownListView; + var selectionModel:ISelectionModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel; + var popUpModel:ISelectionModel = UIBase(viewBead.popUp).model as ISelectionModel; + IUIBase(viewBead.popUp).width = IUIBase(_strand).width; + popUpModel.dataProvider = selectionModel.dataProvider; + popUpModel.labelField = selectionModel.labelField; + viewBead.popUpVisible = true; // adds to display list as well + popUpModel.selectedIndex = selectionModel.selectedIndex; + var pt:Point = new Point(IUIBase(_strand).x, IUIBase(_strand).y + IUIBase(_strand).height); + pt = PointUtils.localToGlobal(pt, _strand); + IUIBase(viewBead.popUp).x = pt.x; + IUIBase(viewBead.popUp).y = pt.y; + IEventDispatcher(viewBead.popUp).addEventListener("change", changeHandler); + UIComponent(viewBead.popUp).callLater(registerDismissHandler); + } + + // The browser send clicks to listeners added as the event is being dispatched, so if we don't + // defer, we pick up the click that opened the dropdown. + private function registerDismissHandler():void + { + 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; + viewBead.popUpVisible = false; + var selectionModel:ISelectionModel = _strand.getBeadByType(ISelectionModel) as ISelectionModel; + var popUpModel:ISelectionModel = UIBase(viewBead.popUp).model as ISelectionModel; + selectionModel.selectedIndex = popUpModel.selectedIndex; + IEventDispatcher(_strand).dispatchEvent(new Event("change")); + } +} + +} diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/DropDownListBase.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/DropDownListBase.as index ebfac16..5ee368a 100644 --- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/DropDownListBase.as +++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/DropDownListBase.as @@ -38,6 +38,8 @@ import spark.components.List; //import spark.events.DropDownEvent; import spark.events.IndexChangeEvent; +import org.apache.royale.core.ISelectionModel; + import mx.core.mx_internal; use namespace mx_internal; @@ -317,7 +319,9 @@ public class DropDownListBase extends List if (dataProvider === value) return; - super.dataProvider = value; + super.dataProvider = value; // this passes it to DataGroup + + (model as ISelectionModel).dataProvider = value; // labelChanged = true; invalidateProperties(); } @@ -367,15 +371,14 @@ public class DropDownListBase extends List /** * @private */ - /* override public function set labelField(value:String):void + override public function set labelField(value:String):void { - if (labelField == value) - return; - - super.labelField = value; - labelChanged = true; - invalidateProperties(); - } */ + super.labelField = value; // this passes it to DataGroup + + (model as ISelectionModel).labelField = value; + //labelChanged = true; + //invalidateProperties(); + } //---------------------------------- // labelFunction