| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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.utils |
| { |
| |
| import flash.events.Event; |
| import flash.events.IEventDispatcher; |
| import flash.events.MouseEvent; |
| import flash.display.InteractiveObject; |
| |
| import mx.core.UIComponent; |
| import mx.events.FlexMouseEvent; |
| import mx.events.SandboxMouseEvent; |
| |
| [ExcludeClass] |
| |
| /** |
| * @private |
| * |
| * Utilities to help with mouse event dispatching or event handling. |
| */ |
| public class MouseEventUtil |
| { |
| include "../core/Version.as"; |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Static Methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Set up event listeners for a complete down-drag-up mouse gesture. |
| * |
| * Add MOUSE_DOWN, MOUSE_MOVE, and MOUSE_UP listeners to the target component |
| * which call the handleDown(), handleDrag(), and handleUp() functions respectively. |
| * |
| * The handleDrag() method will be called for as long as the mouse button is down, |
| * whenever the mouse is dragged within the stage. The handleUp() method will be |
| * called no matter where the mouse button is released, however a MouseEvent type argument |
| * will only be provided if the button is released over the stage. |
| * |
| * The handleDown() and handleDrag() functions are passed a single MouseEvent |
| * argument, and the handleUp() is passed an Event which may be a MouseEvent |
| * or a SandboxMouseEvent. Typically handleUp() functions ignore their event |
| * argument. |
| * |
| * Any of the functions arguments can be null. |
| * |
| * The implementation only adds MOUSE_MOVE and MOUSE_UP listeners in response |
| * to a MOUSE_DOWN event. Similarly, the implementation removes its MOUSE_MOVE |
| * and MOUSE_UP listeners when it receives a MOUSE_UP event. |
| * |
| * @param target A MOUSE_DOWN event on this component begins the down-drag-up gesture |
| * @param handleDown A function with a MouseEvent parameter; called when the MOUSE_DOWN event occurs. |
| * @param handleDrag A function with a MouseEvent parameter; called when the mouse moves with the button down. |
| * @param handleUp A function with an Event parameter; called when the button is relesed. |
| * |
| * @see #removeDownDragUpListeners |
| */ |
| public static function addDownDragUpListeners( |
| target:UIComponent, |
| handleDown:Function, |
| handleDrag:Function, |
| handleUp:Function):void |
| { |
| var f:Function = function(e:Event):void |
| { |
| var sbr:IEventDispatcher; |
| switch(e.type) |
| { |
| case MouseEvent.MOUSE_DOWN: |
| if (e.isDefaultPrevented()) |
| break; |
| handleDown(e); |
| sbr = target.systemManager.getSandboxRoot(); |
| sbr.addEventListener(MouseEvent.MOUSE_MOVE, f, true); |
| sbr.addEventListener(MouseEvent.MOUSE_UP, f, true ); |
| sbr.addEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, f, true); |
| // Add the mouse shield so we can drag over untrusted applications. |
| target.systemManager.deployMouseShields(true); |
| break; |
| case MouseEvent.MOUSE_MOVE: |
| handleDrag(e); |
| break; |
| case MouseEvent.MOUSE_UP: |
| handleUp(e); |
| sbr = target.systemManager.getSandboxRoot(); |
| sbr.removeEventListener(MouseEvent.MOUSE_MOVE, f, true); |
| sbr.removeEventListener(MouseEvent.MOUSE_UP, f, true); |
| sbr.removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, f, true); |
| target.systemManager.deployMouseShields(false); |
| break; |
| case "removeHandler": |
| target.removeEventListener("removeHandler", f); |
| target.removeEventListener(MouseEvent.MOUSE_DOWN, f); |
| sbr = target.systemManager.getSandboxRoot(); |
| sbr.removeEventListener(MouseEvent.MOUSE_MOVE, f, true); |
| sbr.removeEventListener(MouseEvent.MOUSE_UP, f, true); |
| sbr.removeEventListener(SandboxMouseEvent.MOUSE_UP_SOMEWHERE, f, true); |
| target.systemManager.deployMouseShields(false); |
| break; |
| } |
| }; |
| target.addEventListener(MouseEvent.MOUSE_DOWN, f); |
| target.addEventListener("removeHandler", f); |
| } |
| |
| /** |
| * Removes the listeners added by a matching addDownDragUpListeners call. |
| * |
| * @param target A MOUSE_DOWN event on this component begins the down-drag-up gesture |
| * @param handleDown The listener for MOUSE_DOWN events |
| * @param handleDrag The listener for MOUSE_MOVE events when the button is down. |
| * @param handleUp The listener for MOUSE_UP events |
| * |
| * @see #addDownDragUpListeners |
| */ |
| public static function removeDownDragUpListeners( |
| target:UIComponent, |
| handleDown:Function, |
| handleDrag:Function, |
| handleUp:Function):void |
| { |
| target.dispatchEvent( |
| new RemoveHandlerEvent(handleDown, handleDrag, handleUp)); |
| } |
| |
| /** |
| * Create a 'mouseWheelChanging' FlexMouseEvent from a 'mouseWheel' |
| * MouseEvent. |
| */ |
| public static function createMouseWheelChangingEvent(event:MouseEvent):FlexMouseEvent |
| { |
| const flexEvent:FlexMouseEvent = new FlexMouseEvent( |
| FlexMouseEvent.MOUSE_WHEEL_CHANGING, |
| true, true, // bubbles and cancelable |
| event.localX, event.localY, |
| InteractiveObject(event.target), |
| event.ctrlKey, event.altKey, event.shiftKey, |
| event.buttonDown, event.delta); |
| |
| return flexEvent; |
| } |
| } |
| } |
| |
| import flash.events.Event; |
| |
| /** |
| * Event used to remove the handlers associated with the press-drag-release |
| * gesture handlers. |
| */ |
| class RemoveHandlerEvent extends flash.events.Event |
| { |
| public var handleDown:Function; |
| public var handleDrag:Function; |
| public var handleUp:Function; |
| public function RemoveHandlerEvent(handleDown:Function, |
| handleDrag:Function = null, |
| handleUp:Function = null) |
| { |
| this.handleDown = handleDown; |
| this.handleDown = handleDrag; |
| this.handleUp = handleUp; |
| super("removeHandler"); |
| } |
| } |