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