blob: 97fc04fa7bf620d6568be84aaab203eb0ac4fd9c [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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");
}
}