blob: 038b590a47c2fac4381b12932fc703150519f141 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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);
}
}