//////////////////////////////////////////////////////////////////////////////// // // 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 { import flash.display.DisplayObject; import flash.display.Graphics; import flash.events.Event; import flash.events.IEventDispatcher; import flash.events.MouseEvent; import flash.geom.Rectangle; import mx.core.FlexSprite; import mx.core.IFlexModuleFactory; import mx.core.ISWFBridgeGroup; import mx.core.ISWFBridgeProvider; import mx.core.mx_internal; import mx.events.SWFBridgeEvent; import mx.utils.NameUtil; import mx.utils.SecurityUtil; import mx.events.SWFBridgeRequest; import mx.managers.systemClasses.MarshallingSupport; import mx.managers.systemClasses.ChildManager; use namespace mx_internal; [ExcludeClass] /** * @private * This class acts as the SystemManager for a popup window that is * added to a parent SystemManager from a compatible application. * Instead of the popup window being a child of the host * SystemManager as is normally done, the popup is a child of a * SystemManagerProxy, created in the same application domain. * The SystemManagerProxy is the actual display object * added to the host SystemManager. * The scheme is done to give the popup window a SystemManager, * with the same version of Flex and created in the same application domain, * that the pop up window will be able to talk to. */ public class SystemManagerProxy extends SystemManager { include "../core/Version.as"; /** * Constructor. * * @param systemManager The system manager that this class is a proxy for. * This is the system manager in the same application domain as the popup. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function SystemManagerProxy(systemManager:ISystemManager) { super(); _systemManager = systemManager; mp = MarshallingSupport(systemManager.getImplementation("mx.managers::IMarshalSystemManager")); // We are a proxy for a popup - we are the hightest system manager. topLevel = true; // Capture mouseDown so we can switch top level windows and activate // the right focus manager before the components inside start // processing the event. super.addEventListener(MouseEvent.MOUSE_DOWN, proxyMouseDownHandler, true); registerImplementation("mx.managers::IActiveWindowManager", new SystemManagerProxyActivePopUpManager(this)); childManager = new ChildManager(this); } private var mp:MarshallingSupport; //-------------------------------------------------------------------------- // // Overridden properties // //-------------------------------------------------------------------------- //---------------------------------- // screen //---------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function get isProxy():Boolean { return true; } //---------------------------------- // screen //---------------------------------- /** * @inheritDoc */ override public function get screen():Rectangle { // This is called to center an Alert over the systemManager // this proxy represents. return _systemManager.screen; } //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function get topLevelSystemManager():ISystemManager { // The document of this proxy is its pop up. return systemManager.topLevelSystemManager; } /** * @inheritDoc */ override public function get document():Object { // The document of this proxy is its pop up. return mp.findFocusManagerContainer(this); } /** * @private */ override public function set document(value:Object):void { } //---------------------------------- // systemManager //---------------------------------- /** * @private */ private var _systemManager:ISystemManager; /** * The SystemManager that is being proxied. * This is the SystemManager of the application that created this proxy * and the pop up window that is a child of this proxy. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function get systemManager():ISystemManager { return _systemManager; } //-------------------------------------------------------------------------- // // Overridden methods: SystemManager // //-------------------------------------------------------------------------- /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function getDefinitionByName(name:String):Object { return _systemManager.getDefinitionByName(name); } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function create(... params):Object { return IFlexModuleFactory(_systemManager).create.apply(this, params); } override public function getImplementation(interfaceName:String):Object { var obj:Object = super.getImplementation(interfaceName); if (obj) return obj; return _systemManager.getImplementation(interfaceName); } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int=0, useWeakReference:Boolean=false):void { super.addEventListener(type, listener, useCapture, priority, useWeakReference); _systemManager.addEventListener(type, listener, useCapture, priority, useWeakReference); } /** * @inheritDoc * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void { super.removeEventListener(type, listener, useCapture); _systemManager.removeEventListener(type, listener, useCapture); } /** * @private * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function isTopLevel():Boolean { return systemManager.isTopLevel(); } /** * @inheritdoc * * proxy to real system manager. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ override public function getVisibleApplicationRect(bounds:Rectangle = null, skipToSandboxRoot:Boolean = false):Rectangle { return _systemManager.getVisibleApplicationRect(bounds, skipToSandboxRoot); } //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * Activates the FocusManager in an IFocusManagerContainer for the * popup window parented by this proxy. * * @param f The top-level window whose FocusManager should be activated. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function activateByProxy(f:IFocusManagerContainer):void { var awm:IActiveWindowManager = IActiveWindowManager(systemManager.getImplementation("mx.managers::IActiveWindowManager")); awm.activate(f); } /** * Deactivates the focus manager for the popup window * parented by this proxy. * * @param f The top-level window whose FocusManager should be deactivated. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function deactivateByProxy(f:IFocusManagerContainer):void { if (f) f.focusManager.deactivate(); } //-------------------------------------------------------------------------- // // Event handlers // //-------------------------------------------------------------------------- /** * @private * Handles mouse downs on the pop up window. */ private function proxyMouseDownHandler(event:MouseEvent):void { // Tell our parent system manager we are active if our child // is a focus container. If our child is not a focus manager // container we will not be able to activate pop up in this proxy. if (mp.findFocusManagerContainer(this)) mp.dispatchActivatedWindowEvent(this); } } } import flash.display.DisplayObject; import flash.events.IEventDispatcher; import mx.core.ISWFBridgeProvider; import mx.events.SWFBridgeEvent; import mx.managers.IActiveWindowManager; import mx.managers.IFocusManagerContainer; import mx.managers.IMarshalSystemManager; import mx.managers.ISystemManager; import mx.managers.SystemManagerProxy; import mx.utils.NameUtil; import mx.utils.SecurityUtil; class SystemManagerProxyActivePopUpManager implements IActiveWindowManager { private var systemManager:ISystemManager; public function SystemManagerProxyActivePopUpManager(systemManager:ISystemManager) { this.systemManager = systemManager; } /** * @inheritDoc */ public function activate(f:Object):void { // trace("SM Proxy: activate " + f ); // Activate the proxied SystemManager. var mp:IMarshalSystemManager = IMarshalSystemManager(systemManager.getImplementation("mx.managers::IMarshalSystemManager")); var bridge:IEventDispatcher = mp.swfBridgeGroup ? mp.swfBridgeGroup.parentBridge : null; if (bridge) { var mutualTrust:Boolean = SecurityUtil.hasMutualTrustBetweenParentAndChild(ISWFBridgeProvider(mp)); var bridgeEvent:SWFBridgeEvent = new SWFBridgeEvent( SWFBridgeEvent.BRIDGE_WINDOW_ACTIVATE, false, false, { notifier: bridge, window: mutualTrust ? systemManager : NameUtil.displayObjectToString(DisplayObject(systemManager)) }); systemManager.getSandboxRoot().dispatchEvent(bridgeEvent); } } /** * @inheritDoc */ public function deactivate(f:Object):void { // trace("SM Proxy: deactivate " + f ); // Deactivate the proxied SystemManager. var mp:IMarshalSystemManager = IMarshalSystemManager (systemManager.getImplementation("mx.managers::IMarshalSystemManager")); var bridge:IEventDispatcher = mp.swfBridgeGroup ? mp.swfBridgeGroup.parentBridge : null; if (bridge) { var mutualTrust:Boolean = SecurityUtil.hasMutualTrustBetweenParentAndChild(ISWFBridgeProvider(mp)); var bridgeEvent:SWFBridgeEvent = new SWFBridgeEvent( SWFBridgeEvent.BRIDGE_WINDOW_DEACTIVATE, false, false, { notifier: bridge, window: mutualTrust ? systemManager : NameUtil.displayObjectToString(DisplayObject(systemManager)) }); systemManager.getSandboxRoot().dispatchEvent(bridgeEvent); } } public function get numModalWindows():int { return systemManager.numModalWindows; } /** * @private */ public function set numModalWindows(value:int):void { systemManager.numModalWindows = value; } /** * @inheritDoc */ public function addFocusManager(f:IFocusManagerContainer):void { } /** * @inheritDoc */ public function removeFocusManager(f:IFocusManagerContainer):void { deactivate(f); } }