//////////////////////////////////////////////////////////////////////////////// // // 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); } } } } }