📄 subordinatewindow.as
字号:
package com.teknision.flex.air.window
{
import com.teknision.flex.air.window.events.*;
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.NativeWindow;
import flash.display.NativeWindowInitOptions;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.geom.Point;
import flash.net.URLRequest;
import flash.system.ApplicationDomain;
import flash.system.LoaderContext;
import mx.containers.Canvas;
import mx.core.Application;
import mx.core.UIComponent;
import mx.core.WindowedApplication;
import mx.events.FlexEvent;
public class SubordinateWindow extends EventDispatcher{
public static const WINDOWSWFREADY:String="windowswfready";
public var window:NativeWindow;
public var swfloader:DisplayObject;
public var options:SubordinateWindowOptions;
public var newWin:NativeWindow;
private var __supresscloseevent:Boolean=false;
// private var __comgateway:EventGatewayMultiWay;
private var __isopen:Boolean=false;
public function SubordinateWindow(i_options:SubordinateWindowOptions){
// this.closeCOMGateway();
this.options=i_options;
}
public function launch():void{
var n_options:NativeWindowInitOptions = new NativeWindowInitOptions();
n_options.systemChrome = this.options.systemChrome;
n_options.transparent = false;
n_options.resizable=false;
n_options.maximizable=false;
n_options.minimizable=false;
newWin = new NativeWindow(n_options);
var u_size:Point=WindowSizeConverter.sizeForOS(this.options.size);
newWin.minSize=u_size;
newWin.maxSize=u_size;
newWin.width=u_size.x;
newWin.height=u_size.y;
newWin.stage.align="TL";
newWin.stage.scaleMode="noScale";
newWin.title=this.options.title;
newWin.addEventListener(Event.CLOSE,handleNativeWindowClose);
this.window=newWin;
var useloader:Boolean=true;
if(this.options.windowclass!=null){
useloader=false;
}
if(useloader){
var windowpanel:Loader=new Loader();
var dom:ApplicationDomain
if(this.options.childofappdomain){
dom=new ApplicationDomain(ApplicationDomain.currentDomain);
}else{
dom=new ApplicationDomain();
}
var loadercontext:LoaderContext=new LoaderContext(false,dom);
newWin.stage.addChild(windowpanel);
this.swfloader=windowpanel;
windowpanel.addEventListener(SubordinateWindowEvent.CLOSE,handleSubordinateWindowEvent);
windowpanel.addEventListener(SubordinateWindowEvent.APP,handleSubordinateWindowEvent);
windowpanel.addEventListener(SubordinateWindowEvent.MANUAL,handleSubordinateWindowEvent);
windowpanel.addEventListener(SubordinateWindow.WINDOWSWFREADY,windowSWFReady);
windowpanel.contentLoaderInfo.addEventListener(Event.COMPLETE,handlePanelLoadComplete);
windowpanel.load(new URLRequest(this.options.windowswf),loadercontext);
}else{
var windowcontainer:Canvas=new Canvas();
var app:WindowedApplication = WindowedApplication(Application.application);
app.addChild(windowcontainer);
var wininstance:DisplayObject = new this.options.windowclass();
wininstance.addEventListener(SubordinateWindowEvent.CLOSE,handleSubordinateWindowEvent);
wininstance.addEventListener(SubordinateWindowEvent.APP,handleSubordinateWindowEvent);
wininstance.addEventListener(SubordinateWindowEvent.MANUAL,handleSubordinateWindowEvent);
wininstance.addEventListener(SubordinateWindow.WINDOWSWFREADY,windowSWFReady);
wininstance.addEventListener(FlexEvent.CREATION_COMPLETE,handleWinInstanceCreated);
this.swfloader=wininstance;
windowcontainer.addChild(wininstance);
}
this.__isopen=true;
}
private function handleWinInstanceCreated(event:FlexEvent):void{
var wininstance:UIComponent = event.target as UIComponent;
var app:WindowedApplication = WindowedApplication(Application.application);
app.removeChild(wininstance.parent);
wininstance.width = newWin.width;
wininstance.height = newWin.height;
newWin.stage.addChild(wininstance);
// newWin.addEventListener(Event.CLOSE,handleNativeWindowClose);
this.swfloader=wininstance;
handlePanelLoadComplete();
}
public function closeWindow():void{
var ev:Event=new Event(Event.CLOSE);
this.handleNativeWindowClose(ev);
}
public function get isOpen():Boolean{
return this.__isopen;
}
private function handlePanelLoadComplete(event:Event=null):void{
this.window.visible=true;
this.dispatchEvent(new Event(Event.COMPLETE));
}
//this is a hack to handle Flash 9 events.
//have to cast it
private function handleNativeWindowClose(event:Event):void{
trace("HANDLE NATIVE WINDOW CLOSE");
// this.closeCOMGateway();
if(!this.__supresscloseevent){
this.__isopen=false;
this.clearWindowEvents();
var n_event:SubordinateWindowEvent=new SubordinateWindowEvent(this.options.closeevent);
this.dispatchEvent(n_event);
}
}
private function handleSubordinateWindowEvent(event:Event):void{
event.stopPropagation();
// this.closeGatewayOnEvent(event.type);
if(this.typeSuppresesCloseEvent(event.type)){
this.__supresscloseevent=true;
}
var n_event:SubordinateWindowEvent=new SubordinateWindowEvent(event.type);
this.dispatchEvent(n_event);
}
private function typeSuppresesCloseEvent(type:String):Boolean{
var val:Boolean=false;
if(type==SubordinateWindowEvent.APP){
val=true;
}
return val;
}
/*
private function closeGatewayOnEvent(type:String):void{
if(type==SubordinateWindowEvent.APP || type==SubordinateWindowEvent.CLOSE){
this.closeCOMGateway();
}
}
private function initializeCOMGateway(gatewayid:String):void{
if(this.__comgateway==null){
var in_name:String=this.options.comgateway+"_app";
var out_name:String=this.options.comgateway+"_window";
this.__comgateway=new EventGatewayMultiWay(in_name,out_name);
this.__comgateway.addEventListener(EventGateway.INCOMINGEVENT,handleGatewayEvent);
}
}
public function closeCOMGateway():void{
try{
trace("CLOSING GATEWAY IN APP");
this.__comgateway.removeEventListener(EventGateway.INCOMINGEVENT,handleGatewayEvent);
this.__comgateway.close();
}catch(e:Error){
trace("ERROR CLOSING GATEWAY IN APP");
}
}
private function handleGatewayEvent(event:Event):void{
var data:Object=this.__comgateway.getLastEvent();
trace("Got Window Gateway Event:"+data.type);
if(data.type=="windowinit"){
this.windowSWFReady();
}else{
this.handleCustomGatewayEvent(data);
}
}
public function handleCustomGatewayEvent(data:Object):void{
//
}
public function sendGatewayEvent(event:Object):void{
this.__comgateway.sendEvent(event);
}
*/
private function clearWindowEvents():void{
this.window.removeEventListener(Event.CLOSE,handleNativeWindowClose);
this.swfloader.removeEventListener(SubordinateWindowEvent.CLOSE,handleSubordinateWindowEvent);
this.swfloader.removeEventListener(SubordinateWindowEvent.APP,handleSubordinateWindowEvent);
this.swfloader.removeEventListener(SubordinateWindowEvent.MANUAL,handleSubordinateWindowEvent);
this.swfloader.removeEventListener(SubordinateWindow.WINDOWSWFREADY,windowSWFReady);
if(this.swfloader is Loader){
var asloader:Loader= this.swfloader as Loader;
asloader.contentLoaderInfo.removeEventListener(Event.COMPLETE,handlePanelLoadComplete);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//BASE WINDOW GATEWAY EVENT HANDLING
private function windowSWFReady(event:Event=null):void{
event.stopPropagation();
this.dispatchEvent(new Event(WINDOWSWFREADY));
}
//////////////////////////////////////////////////////////////////////////////////////////////
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -