////////////////////////////////////////////////////////////////////////////////
//
// 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.managers.marshalClasses
{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.IEventDispatcher;
import mx.events.DragEvent;
import mx.events.InterDragManagerEvent;
import mx.events.InterManagerRequest;
import mx.events.Request;
import mx.managers.DragManagerImpl;
import mx.managers.IMarshalSystemManager;
import mx.managers.ISystemManager;
import mx.managers.SystemManager;
import mx.managers.SystemManagerGlobals;
import mx.core.DragSource;
import mx.core.IFlexModuleFactory;
import mx.core.mx_internal;
[ExcludeClass]
[Mixin]
/**
* @private
* A SystemManager has various types of children,
* such as the Application, popups,
* tooltips, and custom cursors.
* You can access the just the custom cursors through
* the cursors
property,
* the tooltips via toolTips
, and
* the popups via popUpChildren
. Each one returns
* a SystemChildrenList which implements IChildList. The SystemManager's
* IChildList methods return the set of children that aren't popups, tooltips
* or cursors. To get the list of all children regardless of type, you
* use the rawChildrenList property which returns this SystemRawChildrenList.
*/
public class DragManagerMarshalMixin
{
include "../../core/Version.as";
//--------------------------------------------------------------------------
//
// Class Method
//
//--------------------------------------------------------------------------
public static function init(fbs:IFlexModuleFactory):void
{
if (!DragManagerImpl.mixins)
DragManagerImpl.mixins = [];
if (DragManagerImpl.mixins.indexOf(DragManagerMarshalMixin) == -1)
DragManagerImpl.mixins.push(DragManagerMarshalMixin);
}
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*/
public function DragManagerMarshalMixin(owner:DragManagerImpl = null)
{
super();
if (!owner)
return;
this.dragManager = owner;
dragManager.addEventListener("initialize", initializeHandler);
dragManager.addEventListener("doDrag", doDragHandler);
dragManager.addEventListener("popUpChildren", popUpChildrenHandler);
dragManager.addEventListener("acceptDragDrop", acceptDragDropHandler);
dragManager.addEventListener("showFeedback", showFeedbackHandler);
dragManager.addEventListener("getFeedback", getFeedbackHandler);
dragManager.addEventListener("endDrag", endDragHandler);
}
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
/**
* @private
*/
private var sm:ISystemManager;
/**
* @private
* The highest place we can listen for events in our DOM
*/
private var sandboxRoot:IEventDispatcher;
/**
* @private
*/
private var dragManager:DragManagerImpl;
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
public function initializeHandler(event:Event):void
{
var ed:IEventDispatcher;
sm = SystemManagerGlobals.topLevelSystemManagers[0];
if (!sm.isTopLevelRoot())
{
sandboxRoot = sm.getSandboxRoot();
sandboxRoot.addEventListener(InterDragManagerEvent.DISPATCH_DRAG_EVENT, marshalDispatchEventHandler, false, 0, true);
}
else
{
ed = sm;
sandboxRoot = sm;
sandboxRoot.addEventListener(InterDragManagerEvent.DISPATCH_DRAG_EVENT, marshalDispatchEventHandler, false, 0, true);
}
// trace("creating DragManagerImpl", sm);
sandboxRoot.addEventListener(InterManagerRequest.DRAG_MANAGER_REQUEST, marshalDragManagerHandler, false, 0, true);
var me:InterManagerRequest = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "update";
// trace("--->update request for DragManagerImpl", sm);
sandboxRoot.dispatchEvent(me);
// trace("<---update request for DragManagerImpl", sm);
}
public function doDragHandler(event:Event):void
{
var me:InterManagerRequest = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "isDragging";
me.value = true;
// trace("-->dispatch isDragging for DragManagerImpl", sm, true);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatch isDragging for DragManagerImpl", sm, true);
me = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "mouseShield";
me.value = true;
// trace("-->dispatch add mouseShield.for DragManagerImpl", sm);
sandboxRoot.dispatchEvent(me);
}
public function acceptDragDropHandler(event:Request):void
{
if (dragManager.isDragging)
{
var me:InterManagerRequest = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "acceptDragDrop";
me.value = event.value;
// trace("-->dispatch acceptDragDrop for DragManagerImpl", sm, target);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatch acceptDragDrop for DragManagerImpl", sm, target);
}
// trace("<--acceptDragDrop for DragManagerImpl", sm, target);
}
public function showFeedbackHandler(event:Request):void
{
if (dragManager.isDragging)
{
var me:InterManagerRequest = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "showFeedback";
me.value = event.value;
// trace("-->dispatch showFeedback for DragManagerImpl", sm, feedback);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatch showFeedback for DragManagerImpl", sm, feedback);
}
// trace("<--showFeedback for DragManagerImpl", sm, feedback);
}
public function getFeedbackHandler(event:Request):void
{
// trace("-->getFeedback for DragManagerImpl", sm);
if (!dragManager.dragProxy && dragManager.isDragging)
{
var me:InterManagerRequest = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "getFeedback";
// trace("-->dispatch getFeedback for DragManagerImpl", sm);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatch getFeedback for DragManagerImpl", sm);
event.preventDefault();
event.value = me.value;
}
}
public function popUpChildrenHandler(event:Event):void
{
var mp:IMarshalSystemManager =
IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager"));
mp.addChildToSandboxRoot("popUpChildren", dragManager.dragProxy);
event.preventDefault();
}
public function endDragHandler(event:Event):void
{
var me:InterManagerRequest;
// trace("-->endDrag for DragManagerImpl", sm);
if (dragManager.dragProxy)
{
var mp:IMarshalSystemManager =
IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager"));
mp.removeChildFromSandboxRoot("popUpChildren", dragManager.dragProxy);
dragManager.dragProxy.removeChildAt(0); // The drag image is the only child
dragManager.dragProxy = null;
}
else if (dragManager.isDragging)
{
me = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "endDrag";
// trace("-->dispatch endDrag for DragManagerImpl", sm);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatch endDrag for DragManagerImpl", sm);
}
me = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "mouseShield";
me.value = false;
// trace("-->dispatch remove mouseShield.for DragManagerImpl", sm);
sandboxRoot.dispatchEvent(me);
me = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "isDragging";
me.value = false;
// trace("-->dispatch isDragging for DragManagerImpl", sm, false);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatch isDragging for DragManagerImpl", sm, false);
// trace("<--endDrag for DragManagerImpl", sm);
event.preventDefault();
}
/**
* Marshal dispatchEvents
*/
private function marshalDispatchEventHandler(event:Event):void
{
if (event is InterDragManagerEvent)
return;
var marshalEvent:Object = event;
var swfRoot:DisplayObject = SystemManager.getSWFRoot(marshalEvent.dropTarget);
if (!swfRoot)
return; // doesn't belong to this appdomain
var dragEvent:DragEvent = new DragEvent(marshalEvent.dragEventType, marshalEvent.bubbles, marshalEvent.cancelable);
dragEvent.localX = marshalEvent.localX;
dragEvent.localY = marshalEvent.localY;
dragEvent.action = marshalEvent.action;
dragEvent.ctrlKey = marshalEvent.ctrlKey;
dragEvent.altKey = marshalEvent.altKey;
dragEvent.shiftKey = marshalEvent.shiftKey;
dragEvent.draggedItem = marshalEvent.draggedItem;
dragEvent.dragSource = new DragSource();
var formats:Array = marshalEvent.dragSource.formats;
var n:int = formats.length;
for (var i:int = 0; i < n; i++)
{
// this will call handlers right away, so deferred clipboard will be costly
dragEvent.dragSource.addData(marshalEvent.dragSource.dataForFormat(formats[i]), formats[i]);
}
if (!marshalEvent.dropTarget.dispatchEvent(dragEvent))
{
event.preventDefault();
}
}
/**
* Marshal dragManager
*/
private function marshalDragManagerHandler(event:Event):void
{
if (event is InterManagerRequest)
return;
var marshalEvent:Object = event;
switch (marshalEvent.name)
{
case "isDragging":
// trace("--marshaled isDragging for DragManagerImpl", sm, marshalEvent.value);
dragManager.bDoingDrag = marshalEvent.value;
break;
case "acceptDragDrop":
if (dragManager.dragProxy)
{
// trace("--marshaled acceptDragDrop for DragManagerImpl", sm, marshalEvent.value);
dragManager.dragProxy.target = marshalEvent.value;
}
break;
case "showFeedback":
if (dragManager.dragProxy) // it is our drag
{
// trace("--marshaled showFeedback for DragManagerImpl", sm, marshalEvent.value);
dragManager.showFeedback(marshalEvent.value);
}
break;
case "getFeedback":
if (dragManager.dragProxy) // it is our drag
{
marshalEvent.value = dragManager.getFeedback();
// trace("--marshaled getFeedback for DragManagerImpl", sm, marshalEvent.value);
}
break;
case "endDrag":
// trace("--marshaled endDrag for DragManagerImpl", sm, marshalEvent.value);
dragManager.endDrag();
break;
case "update":
// if we own the drag, then redispatch to tell the new guy
if (dragManager.dragProxy && dragManager.isDragging)
{
// trace("-->marshaled update for DragManagerImpl", sm);
var me:InterManagerRequest = new InterManagerRequest(InterManagerRequest.DRAG_MANAGER_REQUEST);
me.name = "isDragging";
me.value = true;
// trace("-->dispatched isDragging for DragManagerImpl", sm, true);
sandboxRoot.dispatchEvent(me);
// trace("<--dispatched isDragging for DragManagerImpl", sm, true);
// trace("<--marshaled update for DragManagerImpl", sm);
}
}
}
}
}