Repository: flex-asjs Updated Branches: refs/heads/develop 0a2709e6c -> 0d5a4c8e0
Separated event levels in List-based components so each level handles events meaningful to it and dispatches higher-level events as necessary. Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/0d5a4c8e Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/0d5a4c8e Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/0d5a4c8e Branch: refs/heads/develop Commit: 0d5a4c8e0fb82e7326b464db80384a92497456d0 Parents: 0a2709e Author: Peter Ent <[email protected]> Authored: Mon Jan 11 13:29:12 2016 -0500 Committer: Peter Ent <[email protected]> Committed: Mon Jan 11 13:29:12 2016 -0500 ---------------------------------------------------------------------- .../Core/as/src/org/apache/flex/events/Event.as | 5 + .../org/apache/flex/events/ItemAddedEvent.as | 88 ++++++++++++++ .../org/apache/flex/events/ItemClickedEvent.as | 115 +++++++++++++++++++ .../org/apache/flex/events/ItemRemovedEvent.as | 88 ++++++++++++++ .../controllers/ItemRendererMouseController.as | 33 +++--- .../ListSingleSelectionMouseController.as | 47 ++++++-- .../ButtonBarButtonItemRenderer.as | 14 ++- .../flex/html/supportClasses/DataGroup.as | 62 +++------- 8 files changed, 378 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/Core/as/src/org/apache/flex/events/Event.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/Core/as/src/org/apache/flex/events/Event.as b/frameworks/projects/Core/as/src/org/apache/flex/events/Event.as index 765db3d..008909b 100644 --- a/frameworks/projects/Core/as/src/org/apache/flex/events/Event.as +++ b/frameworks/projects/Core/as/src/org/apache/flex/events/Event.as @@ -124,5 +124,10 @@ package org.apache.flex.events { // do nothing } + + public function cloneEvent():org.apache.flex.events.Event + { + return this; + } } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemAddedEvent.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemAddedEvent.as b/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemAddedEvent.as new file mode 100644 index 0000000..24707c0 --- /dev/null +++ b/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemAddedEvent.as @@ -0,0 +1,88 @@ +//////////////////////////////////////////////////////////////////////////////// +// + +// 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 org.apache.flex.events +{ + + import org.apache.flex.events.CustomEvent; + + /** + * The ItemAddedEvent is dispatched by IItemRendererParent objects whenenver an + * itemRenderer is added. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public class ItemAddedEvent extends CustomEvent + { + + //-------------------------------------- + // Constructor + //-------------------------------------- + + /** + * Constructor. + * + * @param type The name of the event. + * @param bubbles Whether the event bubbles. + * @param cancelable Whether the event can be canceled. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function ItemAddedEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) + { + COMPILE::AS3 + { + super(type, bubbles, cancelable); + } + COMPILE::JS + { + super(type); + } + + item = null; + } + + /** + * The item being added. + * + * @export + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public var item:Object; + + /** + * @private + */ + override public function cloneEvent():org.apache.flex.events.Event + { + var newEvent:ItemAddedEvent = new ItemAddedEvent(type); + newEvent.item = item; + return newEvent; + } + } +} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemClickedEvent.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemClickedEvent.as b/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemClickedEvent.as new file mode 100644 index 0000000..ac943b0 --- /dev/null +++ b/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemClickedEvent.as @@ -0,0 +1,115 @@ +//////////////////////////////////////////////////////////////////////////////// +// + +// 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 org.apache.flex.events +{ + + import org.apache.flex.events.CustomEvent; + + /** + * The ItemClickedEvent is a custom event issued by an itemRenderer to + * convey information about itself when it has determined that the + * event(s) happening to it constitute a 'click' on itself. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public class ItemClickedEvent extends CustomEvent + { + + //-------------------------------------- + // Constructor + //-------------------------------------- + + /** + * Constructor. + * + * @param type The name of the event. + * @param bubbles Whether the event bubbles. + * @param cancelable Whether the event can be canceled. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function ItemClickedEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) + { + COMPILE::AS3 + { + super(type, bubbles, cancelable); + } + COMPILE::JS + { + super(type); + } + + index = -1; + data = null; + multipleSelection = false; + } + + /** + * The index of the item beginning with zero. + * + * @export + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public var index:Number; + + /** + * The data of the item. + * + * @export + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public var data:Object; + + /** + * Whether or not this click is part of a multi-selection sequence. + * + * @export + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public var multipleSelection:Boolean; + + /** + * @private + */ + override public function cloneEvent():org.apache.flex.events.Event + { + var newEvent:ItemClickedEvent = new ItemClickedEvent(type); + newEvent.index = index; + newEvent.data = data; + newEvent.multipleSelection = multipleSelection; + return newEvent; + } + } +} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemRemovedEvent.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemRemovedEvent.as b/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemRemovedEvent.as new file mode 100644 index 0000000..d638084 --- /dev/null +++ b/frameworks/projects/HTML/as/src/org/apache/flex/events/ItemRemovedEvent.as @@ -0,0 +1,88 @@ +//////////////////////////////////////////////////////////////////////////////// +// + +// 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 org.apache.flex.events +{ + + import org.apache.flex.events.CustomEvent; + + /** + * The ItemRemovedEvent is dispatched by IItemRendererParent objects whenenver an + * itemRenderer is removed. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public class ItemRemovedEvent extends CustomEvent + { + + //-------------------------------------- + // Constructor + //-------------------------------------- + + /** + * Constructor. + * + * @param type The name of the event. + * @param bubbles Whether the event bubbles. + * @param cancelable Whether the event can be canceled. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public function ItemRemovedEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) + { + COMPILE::AS3 + { + super(type, bubbles, cancelable); + } + COMPILE::JS + { + super(type); + } + + item = null; + } + + /** + * The item being removed. + * + * @export + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion FlexJS 0.0 + */ + public var item:Object; + + /** + * @private + */ + override public function cloneEvent():org.apache.flex.events.Event + { + var newEvent:ItemRemovedEvent = new ItemRemovedEvent(type); + newEvent.item = item; + return newEvent; + } + } +} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ItemRendererMouseController.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ItemRendererMouseController.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ItemRendererMouseController.as index ca06c77..0c637bf 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ItemRendererMouseController.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ItemRendererMouseController.as @@ -33,9 +33,10 @@ COMPILE::JS { import goog.events.EventType; import goog.events; } + import org.apache.flex.events.ItemClickedEvent; /** - * The ItemRendererMouseController class bead handles mouse events in itemRenderers. This + * The ItemRendererMouseController class can mouse events in itemRenderers. This * includes roll-overs, mouse down, and mouse up. These platform-specific events are then * re-dispatched as FlexJS events. * @@ -100,8 +101,7 @@ COMPILE::JS { var target:ISelectableItemRenderer = event.target as ISelectableItemRenderer; if (target) { - target.hovered = true; - target.dispatchEvent(new Event("itemRendererRollOver",true)); + target.dispatchEvent(new Event("itemRollOver",true)); } } @@ -110,8 +110,7 @@ COMPILE::JS { { var target:ISelectableItemRenderer = event.target as ISelectableItemRenderer; if (target) { - target.hovered = true; - target.dispatchEvent(new Event("itemRendererRollOver",true)); + target.dispatchEvent(new Event("itemRollOver",true)); } } @@ -124,9 +123,7 @@ COMPILE::JS { var target:ISelectableItemRenderer = event.target as ISelectableItemRenderer; if (target) { - target.hovered = false; - target.down = false; - target.dispatchEvent(new Event("itemRendererRollOut",true)); + target.dispatchEvent(new Event("itemRollOut",true)); } } @@ -136,9 +133,7 @@ COMPILE::JS { var target:ISelectableItemRenderer = event.target as ISelectableItemRenderer; if (target) { - target.hovered = false; - target.down = false; - target.dispatchEvent(new Event("itemRendererRollOut",true)); + target.dispatchEvent(new Event("itemRollOut",true)); } } @@ -179,9 +174,13 @@ COMPILE::JS { var target:ISelectableItemRenderer = event.currentTarget as ISelectableItemRenderer; if (target) { + var newEvent:ItemClickedEvent = new ItemClickedEvent("itemClicked"); + newEvent.data = target.data; + newEvent.multipleSelection = event.shiftKey; + newEvent.index = target.index; + target.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); - target.selected = true; - target.dispatchEvent(new Event("selected")); + target.dispatchEvent(newEvent); } } @@ -194,8 +193,12 @@ COMPILE::JS { var target:ISelectableItemRenderer = event.currentTarget as ISelectableItemRenderer; if (target) { - target.selected = true; - target.dispatchEvent(new Event("selected")); + var newEvent:ItemClickedEvent = new ItemClickedEvent("itemClicked"); + newEvent.data = target.data; + newEvent.multipleSelection = event.shiftKey; + newEvent.index = target.index; + + target.dispatchEvent(newEvent); } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.as index 9760591..e8a1f1f 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/beads/controllers/ListSingleSelectionMouseController.as @@ -26,8 +26,12 @@ package org.apache.flex.html.beads.controllers import org.apache.flex.core.IStrand; import org.apache.flex.events.Event; import org.apache.flex.events.IEventDispatcher; + import org.apache.flex.events.ItemAddedEvent; + import org.apache.flex.events.ItemRemovedEvent; import org.apache.flex.events.MouseEvent; import org.apache.flex.html.beads.IListView; + + import org.apache.flex.events.ItemClickedEvent; /** * The ListSingleSelectionMouseController class is a controller for @@ -103,25 +107,48 @@ package org.apache.flex.html.beads.controllers _strand = value; listModel = value.getBeadByType(ISelectionModel) as ISelectionModel; listView = value.getBeadByType(IListView) as IListView; - dataGroup = listView.dataGroup; - dataGroup.addEventListener("selected", selectedHandler, true); - IEventDispatcher(_strand).addEventListener(MouseEvent.ROLL_OVER, rolloverHandler); + IEventDispatcher(_strand).addEventListener("itemAdded", handleItemAdded); + IEventDispatcher(_strand).addEventListener("itemRemoved", handleItemRemoved); + } + + private function handleItemAdded(event:ItemAddedEvent):void + { + IEventDispatcher(event.item).addEventListener("itemClicked", selectedHandler); + IEventDispatcher(event.item).addEventListener("itemRollOver", rolloverHandler); + IEventDispatcher(event.item).addEventListener("itemRollOut", rolloutHandler); } - private function selectedHandler(event:Event):void + private function handleItemRemoved(event:ItemAddedEvent):void + { + IEventDispatcher(event.item).removeEventListener("itemClicked", selectedHandler); + IEventDispatcher(event.item).removeEventListener("itemRollOver", rolloverHandler); + IEventDispatcher(event.item).removeEventListener("itemRollOut", rolloutHandler); + } + + private function selectedHandler(event:ItemClickedEvent):void { - listModel.selectedIndex = ISelectableItemRenderer(event.target).index; + listModel.selectedIndex = event.index; listView.host.dispatchEvent(new Event("change")); } - private function rolloverHandler(event:Event):void - { - var renderer:ISelectableItemRenderer = event.target as ISelectableItemRenderer; + private function rolloverHandler(event:Event):void + { + var renderer:ISelectableItemRenderer = event.currentTarget as ISelectableItemRenderer; if (renderer) { - //trace("ListSingleSelectionMouseController.ROLL_OVER"); + renderer.hovered = true; IRollOverModel(listModel).rollOverIndex = renderer.index; } - } + } + + private function rolloutHandler(event:Event):void + { + var renderer:ISelectableItemRenderer = event.currentTarget as ISelectableItemRenderer; + if (renderer) { + renderer.hovered = false; + renderer.down = false; + IRollOverModel(listModel).rollOverIndex = -1; + } + } } } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ButtonBarButtonItemRenderer.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ButtonBarButtonItemRenderer.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ButtonBarButtonItemRenderer.as index 64a9e43..a461fac 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ButtonBarButtonItemRenderer.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/ButtonBarButtonItemRenderer.as @@ -22,8 +22,10 @@ package org.apache.flex.html.supportClasses import org.apache.flex.core.IItemRendererParent; import org.apache.flex.core.UIBase; import org.apache.flex.events.Event; + import org.apache.flex.events.MouseEvent; import org.apache.flex.html.TextButton; import org.apache.flex.html.beads.ITextItemRenderer; + import org.apache.flex.events.ItemClickedEvent; /** * The ButtonBarButtonItemRenderer class handles the display of each item for the @@ -63,10 +65,13 @@ package org.apache.flex.html.supportClasses /** * @private */ - private function handleClickEvent(event:Event):void + private function handleClickEvent(event:MouseEvent):void { - var parent:Object = itemRendererParent; - (parent as UIBase).dispatchEvent(new Event("selected", this)); + var newEvent:ItemClickedEvent = new ItemClickedEvent("itemClicked"); + newEvent.multipleSelection = event.shiftKey; + newEvent.index = index; + newEvent.data = data; + dispatchEvent(newEvent); } /** @@ -102,6 +107,9 @@ package org.apache.flex.html.supportClasses var added:Boolean = false; if (textButton == null) { textButton = new TextButton(); + + // listen for clicks on the button and translate them into + // an itemClicked event. textButton.addEventListener('click',handleClickEvent); added = true; } http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0d5a4c8e/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/DataGroup.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/DataGroup.as b/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/DataGroup.as index c156a6f..15b6587 100644 --- a/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/DataGroup.as +++ b/frameworks/projects/HTML/as/src/org/apache/flex/html/supportClasses/DataGroup.as @@ -22,10 +22,14 @@ package org.apache.flex.html.supportClasses import org.apache.flex.core.IItemRenderer; import org.apache.flex.core.IItemRendererParent; import org.apache.flex.core.IRollOverModel; + import org.apache.flex.core.ISelectionModel; import org.apache.flex.core.IStrand; import org.apache.flex.core.UIBase; import org.apache.flex.events.IEventDispatcher; import org.apache.flex.events.Event; + import org.apache.flex.events.ItemAddedEvent; + import org.apache.flex.events.ItemClickedEvent; + import org.apache.flex.events.ItemRemovedEvent; /** * The DataGroup class is the IItemRendererParent used internally @@ -58,59 +62,25 @@ package org.apache.flex.html.supportClasses { super.addElement(c, dispatchEvent); - var dispatcher:IEventDispatcher = c as IEventDispatcher; - dispatcher.addEventListener("itemRendererRollOver", handleRollOver); - dispatcher.addEventListener("itemRendererRollOut", handleRollOut); + var newEvent:ItemAddedEvent = new ItemAddedEvent("itemAdded"); + newEvent.item = c; + + var strand:IEventDispatcher = parent as IEventDispatcher; + strand.dispatchEvent(newEvent); } /** * @private */ override public function removeElement(c:Object, dispatchEvent:Boolean = true):void - { - var dispatcher:IEventDispatcher = c as IEventDispatcher; - dispatcher.removeEventListener("itemRendererRollOver", handleRollOver); - dispatcher.removeEventListener("itemRendererRollOut", handleRollOut); - + { super.removeElement(c, dispatchEvent); - } - - /** - * @private - */ - private function handleRollOver(event:Event):void - { - var strand:IStrand = parent as IStrand; - var rollModel:IRollOverModel = strand.getBeadByType(IRollOverModel) as IRollOverModel; - if (rollModel) { - var n:int = numElements; - for (var i:int=0; i < n; i++) { - var renderer:Object = getElementAt(i); - if (renderer == event.currentTarget) { - rollModel.rollOverIndex = i; - break; - } - } - } - } - - /** - * @private - */ - private function handleRollOut(event:Event):void - { - var strand:IStrand = parent as IStrand; - var rollModel:IRollOverModel = strand.getBeadByType(IRollOverModel) as IRollOverModel; - if (rollModel) { - var n:int = numElements; - for (var i:int=0; i < n; i++) { - var renderer:Object = getElementAt(i); - if (renderer == event.currentTarget) { - rollModel.rollOverIndex = -1; - break; - } - } - } + + var newEvent:ItemRemovedEvent = new ItemRemovedEvent("itemRemoved"); + newEvent.item = c; + + var strand:IEventDispatcher = parent as IEventDispatcher; + strand.dispatchEvent(newEvent); } /**
