//////////////////////////////////////////////////////////////////////////////// // // 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.display.DisplayObjectContainer; import flash.display.Sprite; import flash.events.Event; import flash.events.IEventDispatcher; import flash.geom.Rectangle; import flash.geom.Point; import mx.core.FlexGlobals; import mx.core.IFlexDisplayObject; import mx.core.IFlexModuleFactory; import mx.core.ISWFLoader; import mx.core.IUIComponent; import mx.core.mx_internal; import mx.events.DynamicEvent; import mx.events.InterManagerRequest; import mx.events.MoveEvent; import mx.events.Request; import mx.events.SandboxMouseEvent; import mx.events.SWFBridgeRequest; import mx.managers.IActiveWindowManager; import mx.managers.IFocusManagerContainer; import mx.managers.IMarshalSystemManager; import mx.managers.ISystemManager; import mx.managers.PopUpManagerImpl; import mx.managers.PopUpData; import mx.managers.SystemManager; import mx.managers.SystemManagerGlobals; import mx.managers.SystemManagerProxy; import mx.styles.IStyleClient; import mx.utils.NameUtil; use namespace 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 PopUpManagerMarshalMixin { include "../../core/Version.as"; //-------------------------------------------------------------------------- // // Class Method // //-------------------------------------------------------------------------- public static function init(fbs:IFlexModuleFactory):void { if (!PopUpManagerImpl.mixins) PopUpManagerImpl.mixins = []; if (PopUpManagerImpl.mixins.indexOf(PopUpManagerMarshalMixin) == -1) { PopUpManagerImpl.mixins.push(PopUpManagerMarshalMixin); PopUpManagerImpl.popUpInfoClass = MarshalPopUpData; } } //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. */ public function PopUpManagerMarshalMixin(owner:PopUpManagerImpl = null) { super(); if (!owner) return; this.popUpManager = owner; sm = ISystemManager(SystemManagerGlobals.topLevelSystemManagers[0]); popUpManager.addEventListener("initialize", initializeHandler); popUpManager.addEventListener("addPopUp", addPopUpHandler); popUpManager.addEventListener("addPlaceHolder", addPlaceHolderHandler); popUpManager.addEventListener("addedPopUp", addedPopUpHandler); popUpManager.addEventListener("topLevelSystemManager", topLevelSystemManagerHandler); popUpManager.addEventListener("isTopLevelRoot", isTopLevelRootHandler); popUpManager.addEventListener("bringToFront", bringToFrontHandler); popUpManager.addEventListener("createModalWindow", createModalWindowHandler); popUpManager.addEventListener("updateModalMask", updateModalMaskHandler); popUpManager.addEventListener("createdModalWindow", createdModalWindowHandler); popUpManager.addEventListener("showModalWindow", showModalWindowHandler); popUpManager.addEventListener("blurTarget", blurTargetHandler); popUpManager.addEventListener("hideModalWindow", hideModalWindowHandler); popUpManager.addEventListener("addMouseOutEventListeners", addMouseOutEventListenersHandler); popUpManager.addEventListener("removeMouseOutEventListeners", removeMouseOutEventListenersHandler); popUpManager.addEventListener("popUpRemoved", popUpRemovedHandler); } //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- /** * @private */ private var popUpManager:PopUpManagerImpl; private var sm:ISystemManager; //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- public function initializeHandler(event:Event):void { sm.addEventListener(SWFBridgeRequest.CREATE_MODAL_WINDOW_REQUEST, createModalWindowRequestHandler, false, 0, true); sm.addEventListener(SWFBridgeRequest.SHOW_MODAL_WINDOW_REQUEST, showModalWindowRequest, false, 0, true); sm.addEventListener(SWFBridgeRequest.HIDE_MODAL_WINDOW_REQUEST, hideModalWindowRequest, false, 0, true); } public function addPopUpHandler(event:Request):void { var sm:ISystemManager = event.value.sm as ISystemManager; var parent:DisplayObjectContainer = event.value.parent as DisplayObjectContainer; if (!sm) { // check if parent is our sandbox root sm = ISystemManager(SystemManagerGlobals.topLevelSystemManagers[0]); if (sm.getSandboxRoot() != parent) { //trace("error: popup root was not SystemManager"); return; // and maybe a nice error message } } // if using a bridge, then create a System Manager Proxy to host // the popup. The System Manager Proxy is the display object // added to the top-level system manager's children, not // the popup itself. var sbRoot:DisplayObject = sm.getSandboxRoot(); var request:SWFBridgeRequest = null; var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); if (mp.useSWFBridge()) { if (sbRoot != sm) { var smp:SystemManagerProxy = new SystemManagerProxy(sm); request = new SWFBridgeRequest(SWFBridgeRequest.ADD_POP_UP_REQUEST, false, false, mp.swfBridgeGroup.parentBridge, { window: DisplayObject(smp), parent: parent, modal: event.value.modal, childList: event.value.childList}); sbRoot.dispatchEvent(request); event.value = smp; event.preventDefault(); } } } public function addPlaceHolderHandler(event:DynamicEvent):void { var sm:ISystemManager = event.sm as ISystemManager; var window:IFlexDisplayObject = event.window as IFlexDisplayObject var sbRoot:DisplayObject = sm.getSandboxRoot(); var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); // add a placeholder for an untrusted popup if this system manager // is hosting the popup. if (!sm.isTopLevelRoot() && sbRoot && DisplayObject(sm) == sbRoot) { var request:SWFBridgeRequest = new SWFBridgeRequest(SWFBridgeRequest.ADD_POP_UP_PLACE_HOLDER_REQUEST, false, false, null, { window: DisplayObject(window)}); request.requestor = mp.swfBridgeGroup.parentBridge; request.data.placeHolderId = NameUtil.displayObjectToString(DisplayObject(window)); sm.dispatchEvent(request); } } public function addedPopUpHandler(event:DynamicEvent):void { var smp:ISystemManager = ISystemManager(event.systemManager); var awm:IActiveWindowManager = IActiveWindowManager(smp.getImplementation("mx.managers::IActiveWindowManager")); var mp:IMarshalSystemManager = IMarshalSystemManager(smp.getImplementation("mx.managers::IMarshalSystemManager")); if (!(smp is SystemManagerProxy) && mp.useSWFBridge()) // We want the top-level root to activate the window. mp.dispatchActivatedWindowEvent(DisplayObject(event.window)); else awm.activate(IFocusManagerContainer(event.window)); } public function topLevelSystemManagerHandler(event:Request):void { var parent:DisplayObjectContainer = event.value as DisplayObjectContainer; var localRoot:DisplayObjectContainer; if (parent.parent is SystemManagerProxy) localRoot = DisplayObjectContainer(SystemManagerProxy(parent.parent).systemManager); else if (parent is IUIComponent && IUIComponent(parent).systemManager is SystemManagerProxy) localRoot = DisplayObjectContainer(SystemManagerProxy(IUIComponent(parent).systemManager).systemManager); if (localRoot) { event.value = localRoot; event.preventDefault(); } } public function isTopLevelRootHandler(event:Request):void { // Only need to calc the visible rect when the sandbox root is an untrusted application. // Otherwise the alert will float over the entire application. if (sm != sm.getSandboxRoot()) { var request:InterManagerRequest = new InterManagerRequest(InterManagerRequest.SYSTEM_MANAGER_REQUEST, false, false, "isTopLevelRoot"); sm.getSandboxRoot().dispatchEvent(request); event.value = Boolean(request.value); event.preventDefault(); } } public function bringToFrontHandler(event:DynamicEvent):void { var o:PopUpData = event.popUpData; var popUp:IFlexDisplayObject = event.popUp; const sm:ISystemManager = ISystemManager(popUp.parent); if (sm is SystemManagerProxy) { // Since the proxy is parented to the SystemManager we need to // be it to the front, not the pop up. var request:InterManagerRequest = new InterManagerRequest(InterManagerRequest.SYSTEM_MANAGER_REQUEST, false, false, "bringToFront", {topMost: o.topMost, popUp: sm}); sm.getSandboxRoot().dispatchEvent(request); event.preventDefault(); } } public function createModalWindowHandler(event:DynamicEvent):void { var o:MarshalPopUpData = event.popUpData; var popUp:IFlexDisplayObject = event.popUp; var popupStyleClient:IStyleClient = popUp as IStyleClient; // set alpha of the popup and get it out of the focus loop if (!isNaN(o.modalTransparency)) o.modalWindow.alpha = o.modalTransparency; o.modalTransparency = o.modalWindow.alpha; if (!isNaN(o.modalTransparencyColor)) event.color = o.modalTransparencyColor; o.modalTransparencyColor = event.color; event.preventDefault(); } public function updateModalMaskHandler(event:DynamicEvent):void { var o:MarshalPopUpData = event.popUpData; if (o.exclude) { o.modalMask = new Sprite(); updateModalMask(sm, o.modalWindow, o.useExclude ? o.exclude : null, o.excludeRect, o.modalMask); o.modalWindow.mask = o.modalMask; event.childrenList.addChild(o.modalMask); // update the modal window mask when the size or position of the area // we are excluding changes. o.exclude.addEventListener(Event.RESIZE, o.resizeHandler); o.exclude.addEventListener(MoveEvent.MOVE, o.resizeHandler); } } public function createdModalWindowHandler(event:DynamicEvent):void { var o:MarshalPopUpData = event.popUpData; var popUp:IFlexDisplayObject = event.popUp; var popupStyleClient:IStyleClient = popUp as IStyleClient; var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); if (mp.useSWFBridge()) { if (popupStyleClient) { o.modalTransparencyDuration = popupStyleClient.getStyle("modalTransparencyDuration"); o.modalTransparencyBlur = popupStyleClient.getStyle("modalTransparencyBlur"); } dispatchModalWindowRequest(SWFBridgeRequest.CREATE_MODAL_WINDOW_REQUEST, sm, sm.getSandboxRoot(), o, event.visibleFlag); } } /** * @private * * Update a mask to exclude the area of the exclude parameter from the area * of the modal window parameter. * * @param sm The system manager that hosts the modal window * @param modalWindow The base area of the mask * @param exclude The area to exlude from the mask, may be null. * @param excludeRect An optionally rectangle that is included in the area * to exclude. The rectangle is in global coordinates. * @param mask A non-null sprite. The mask is rewritten for each call. * */ mx_internal static function updateModalMask(sm:ISystemManager, modalWindow:DisplayObject, exclude:IUIComponent, excludeRect:Rectangle, mask:Sprite):void { var modalBounds:Rectangle = modalWindow.getBounds(DisplayObject(sm)); var excludeBounds:Rectangle; var pt:Point; if (exclude is ISWFLoader) { excludeBounds = ISWFLoader(exclude).getVisibleApplicationRect(); pt = new Point(excludeBounds.x, excludeBounds.y); pt = DisplayObject(sm).globalToLocal(pt); excludeBounds.x = pt.x; excludeBounds.y = pt.y; } else if (!exclude) excludeBounds = modalBounds.clone(); // don't exclude anything extra else excludeBounds = DisplayObject(exclude).getBounds(DisplayObject(sm)); // apply excludeRect to the result if (excludeRect) { pt = new Point(excludeRect.x, excludeRect.y); pt = DisplayObject(sm).globalToLocal(pt); var rect:Rectangle = new Rectangle(pt.x, pt.y, excludeRect.width, excludeRect.height); excludeBounds = excludeBounds.intersection(rect); } mask.graphics.clear(); mask.graphics.beginFill(0x000000); // Fill the mask in three logical rows // 1. Above the exclude bounds if (excludeBounds.y > modalBounds.y) mask.graphics.drawRect(modalBounds.x, modalBounds.y, modalBounds.width, excludeBounds.y - modalBounds.y); // 2. Left and right of the exclude bounds if (modalBounds.x < excludeBounds.x) mask.graphics.drawRect(modalBounds.x, excludeBounds.y, excludeBounds.x - modalBounds.x, excludeBounds.height); if ((modalBounds.x + modalBounds.width) > (excludeBounds.x + excludeBounds.width)) mask.graphics.drawRect(excludeBounds.x + excludeBounds.width, excludeBounds.y, modalBounds.x + modalBounds.width - excludeBounds.x - excludeBounds.width, excludeBounds.height); // 3. Below the exclude bounds if ((excludeBounds.y + excludeBounds.height) < (modalBounds.y + modalBounds.height)) mask.graphics.drawRect(modalBounds.x, excludeBounds.y + excludeBounds.height, modalBounds.width, modalBounds.y + modalBounds.height - excludeBounds.y - excludeBounds.height); mask.graphics.endFill(); } private function dispatchModalWindowRequest(type:String, sm:ISystemManager, sbRoot:DisplayObject, o:MarshalPopUpData, visibleFlag:Boolean):void { // if our first target is a sandbox root that is the top level root, // then we don't need to send a modal request. if (!o.isRemoteModalWindow && sm != sbRoot) { var request:InterManagerRequest = new InterManagerRequest(InterManagerRequest.SYSTEM_MANAGER_REQUEST, false, false, "isTopLevelRoot"); sbRoot.dispatchEvent(request); if (Boolean(request.value)) return; } var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); var modalRequest:SWFBridgeRequest = new SWFBridgeRequest(type, false, false, null, { skip: !o.isRemoteModalWindow && sm != sbRoot, useExclude: o.useExclude, show: visibleFlag, remove: false, transparencyDuration: o.modalTransparencyDuration, transparency: o.modalTransparency, transparencyColor: o.modalTransparencyColor, transparencyBlur: o.modalTransparencyBlur}); var bridge:IEventDispatcher = mp.swfBridgeGroup.parentBridge;; modalRequest.requestor = bridge; bridge.dispatchEvent(modalRequest); } public function showModalWindowHandler(event:DynamicEvent):void { event.preventDefault(); var o:MarshalPopUpData = event.popUpData; var popUp:IFlexDisplayObject = o.owner as IFlexDisplayObject; var sm:ISystemManager = event.systemManager; if (!isNaN(o.modalTransparencyDuration)) event.duration = o.modalTransparencyDuration; o.modalTransparencyDuration = event.duration; if (!isNaN(o.modalTransparency)) event.alpha = o.modalTransparency; o.modalTransparency = event.alpha; if (!isNaN(o.modalTransparencyBlur)) event.blurAmount = o.modalTransparencyBlur; o.modalTransparencyBlur = event.blurAmount; if (!isNaN(o.modalTransparencyColor)) event.transparencyColor = o.modalTransparencyColor; o.modalTransparencyColor = event.transparencyColor; var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); if (sm is SystemManagerProxy) sm = SystemManagerProxy(sm).systemManager; if (event.sendRequest && mp.useSWFBridge()) dispatchModalWindowRequest(SWFBridgeRequest.SHOW_MODAL_WINDOW_REQUEST, sm, sm.getSandboxRoot(), o, true); } public function blurTargetHandler(event:Request):void { var o:PopUpData = event.value.popUpData; var popUp:IFlexDisplayObject = o.owner as IFlexDisplayObject; const sm:ISystemManager = ISystemManager(popUp.parent); var sbRoot:DisplayObject = sm.getSandboxRoot(); var applicationRequest:InterManagerRequest = new InterManagerRequest(InterManagerRequest.SYSTEM_MANAGER_REQUEST, false, false, "application", sbRoot); sbRoot.dispatchEvent(applicationRequest); event.value = applicationRequest.value; event.preventDefault(); } public function hideModalWindowHandler(event:DynamicEvent):void { var o:MarshalPopUpData = event.popUpData; var destroy:Boolean = event.destroy; if (destroy && o.exclude) { o.exclude.removeEventListener(Event.RESIZE, o.resizeHandler); o.exclude.removeEventListener(MoveEvent.MOVE, o.resizeHandler); } var sm:ISystemManager = ISystemManager(FlexGlobals.topLevelApplication.systemManager); var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); if (mp.useSWFBridge()) { var sbRoot:DisplayObject = sm.getSandboxRoot(); // if our first target is a sandbox root that is the top level root, // then we don't need to send a modal request. if (!o.isRemoteModalWindow && sm != sbRoot) { var request:InterManagerRequest = new InterManagerRequest(InterManagerRequest.SYSTEM_MANAGER_REQUEST, false, false, "isTopLevelRoot"); sbRoot.dispatchEvent(request); if (Boolean(request.value)) return; } var modalRequest:SWFBridgeRequest = new SWFBridgeRequest(SWFBridgeRequest.HIDE_MODAL_WINDOW_REQUEST, false, false, null, { skip: !o.isRemoteModalWindow && sm != sbRoot, show: false, remove: destroy}); var bridge:IEventDispatcher = mp.swfBridgeGroup.parentBridge; var target:IEventDispatcher; modalRequest.requestor = bridge; bridge.dispatchEvent(modalRequest); } } /** * @private * * Create a modal window and optionally show it. */ private function createModalWindowRequestHandler(event:Event):void { var request:SWFBridgeRequest; if (event is SWFBridgeRequest) request = SWFBridgeRequest(event); else request = SWFBridgeRequest.marshal(event); var sm:ISystemManager = popUpManager.getTopLevelSystemManager(DisplayObject(FlexGlobals.topLevelApplication)); var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); var sbRoot:DisplayObject = sm.getSandboxRoot(); // process the message var popUpData:MarshalPopUpData = MarshalPopUpData(PopUpManagerImpl.createPopUpData()); popUpData.isRemoteModalWindow = true; popUpData.systemManager = sm; popUpData.modalTransparency = request.data.transparency; // disable blur because we can mask the application and blur is not // working if we blur the modalWindow. popUpData.modalTransparencyBlur = 0; //request.transparencyBlur; popUpData.modalTransparencyColor = request.data.transparencyColor; popUpData.modalTransparencyDuration = request.data.transparencyDuration; // Get the SWFLoader to exclude. // The requestor may be a real SWFLoader or a sandbox bridge that // requires a look up to get the SWFLoader. popUpData.exclude = mp.swfBridgeGroup.getChildBridgeProvider(request.requestor) as IUIComponent; popUpData.useExclude = request.data.useExclude; popUpData.excludeRect = Rectangle(request.data.excludeRect); popUpManager.popupInfo.push(popUpData); popUpManager.createModalWindow(null, popUpData, sm.popUpChildren, request.data.show, sm, sbRoot); } /** * @private * * Show a modal window. */ private function showModalWindowRequest(event:Event):void { var request:SWFBridgeRequest = SWFBridgeRequest.marshal(event); if (event is SWFBridgeRequest) request = SWFBridgeRequest(event); else request = SWFBridgeRequest.marshal(event); var sm:ISystemManager = popUpManager.getTopLevelSystemManager(DisplayObject(FlexGlobals.topLevelApplication)); var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); var sbRoot:DisplayObject = sm.getSandboxRoot(); // the highest popUpData in the list is the most recent modal window. // sanity check that the popupdata is really a modal window with a null // parent and popup window. var popUpData:MarshalPopUpData = findHighestRemoteModalPopupInfo(); popUpData.excludeRect = Rectangle(request.data); popUpData.modalTransparency = request.data.transparency; // disable blur because we can mask the application and blur is not // working if we blur the modalWindow. popUpData.modalTransparencyBlur = 0; //request.transparencyBlur; popUpData.modalTransparencyColor = request.data.transparencyColor; popUpData.modalTransparencyDuration = request.data.transparencyDuration; if (popUpData.owner || popUpData.parent) throw new Error(); // not popUpData for a modal window popUpManager.showModalWindow(popUpData, sm); } /** * @private * * Hide a modal window and optionally remove it. */ private function hideModalWindowRequest(event:Event):void { var request:SWFBridgeRequest; // If the event is redispatched from the SystemManger it will be // marshalled. If the PopUpManager dispatches the event using // the sandbox root it will come here directly. if (event is SWFBridgeRequest) request = SWFBridgeRequest(event); else request = SWFBridgeRequest.marshal(event); var sm:ISystemManager = popUpManager.getTopLevelSystemManager(DisplayObject(FlexGlobals.topLevelApplication)); var sbRoot:DisplayObject = sm.getSandboxRoot(); // the highest popUpData in the list is the most recent modal window. // sanity check that the popupdata is really a modal window with a null // parent and popup window. var popUpData:MarshalPopUpData = findHighestRemoteModalPopupInfo(); if (!popUpData || popUpData.owner || popUpData.parent) throw new Error(); // not popUpData for a modal window popUpManager.hideModalWindow(popUpData, request.data.remove); // handle removing popup window if (request.data.remove) { popUpManager.popupInfo.splice(popUpManager.popupInfo.indexOf(popUpData), 1); var awm:IActiveWindowManager = IActiveWindowManager(sm.getImplementation("mx.managers::IActiveWindowManager")); awm.numModalWindows--; } } private function popUpRemovedHandler(event:DynamicEvent):void { var o:PopUpData = event.popUpData; var popUp:IFlexDisplayObject = o.owner as IFlexDisplayObject; var sm:ISystemManager = o.systemManager; var mp:IMarshalSystemManager = IMarshalSystemManager(sm.getImplementation("mx.managers::IMarshalSystemManager")); // remove the focus manager from a bridged system manager, if any if (sm is SystemManagerProxy) { var parentBridge:IEventDispatcher = mp.swfBridgeGroup.parentBridge; var request:SWFBridgeRequest = new SWFBridgeRequest(SWFBridgeRequest.REMOVE_POP_UP_REQUEST, false, false, parentBridge, { window: DisplayObject(sm), parent: o.parent, modal: o.modalWindow != null}); sm.getSandboxRoot().dispatchEvent(request); } else if (mp.useSWFBridge()) { // Must be locally hosted popup. // We need to remove the placeholder at the top level root request = new SWFBridgeRequest(SWFBridgeRequest.REMOVE_POP_UP_PLACE_HOLDER_REQUEST, false, false, null, { window: DisplayObject(popUp)}); request.requestor = mp.swfBridgeGroup.parentBridge; request.data.placeHolderId = NameUtil.displayObjectToString(DisplayObject(popUp)); sm.dispatchEvent(request); } } public function addMouseOutEventListenersHandler(event:DynamicEvent):void { var o:MarshalPopUpData = event.popUpData; var sbRoot:DisplayObject = o.systemManager.getSandboxRoot(); sbRoot.addEventListener(SandboxMouseEvent.MOUSE_DOWN_SOMEWHERE, o.marshalMouseOutsideHandler); sbRoot.addEventListener(SandboxMouseEvent.MOUSE_WHEEL_SOMEWHERE, o.marshalMouseOutsideHandler, true); } public function removeMouseOutEventListenersHandler(event:DynamicEvent):void { var o:MarshalPopUpData = event.popUpData; var sbRoot:DisplayObject = o.systemManager.getSandboxRoot(); sbRoot.removeEventListener(SandboxMouseEvent.MOUSE_DOWN_SOMEWHERE, o.marshalMouseOutsideHandler); sbRoot.removeEventListener(SandboxMouseEvent.MOUSE_WHEEL_SOMEWHERE, o.marshalMouseOutsideHandler, true); } /** * @private * Returns the PopUpData for the highest remote modal window on display. */ private function findHighestRemoteModalPopupInfo():MarshalPopUpData { const n:int = popUpManager.popupInfo.length - 1; for (var i:int = n; i >= 0; i--) { var o:MarshalPopUpData = popUpManager.popupInfo[i]; if (o.isRemoteModalWindow) return o; } return null; } } }