package com.justinimhoff.techlabs {
import mx.containers.Canvas;
import flash.events.MouseEvent;
import flash.desktop.NativeApplication;
import mx.containers.HBox;
import mx.controls.Button;
import mx.styles.StyleManager;
import flash.display.NativeWindowDisplayState;
import mx.events.FlexEvent;
import flash.display.NativeWindow;
import mx.containers.VBox;
import mx.core.WindowedApplication;
import mx.controls.Image;
/**
*
* Creates a native application window based on the Canvas components which impliments an abolute layout.
* The appWindow leverages a MAC and PC skin based on either user preferance or operating system.
* Allows for essentially 4 states: active - inactive, mac-pc
*
*/
public class AppWindow extends Canvas {
private var windowControls:HBox;
private var header:HBox;
private var closeButton:Button;
private var minimizeButton:Button;
private var maximizeButton:Button;
private var resizeButton:Button;
private var winCloseGlow:Image;
private var winMinimizeGlow:Image;
private var winMaximizeGlow:Image
private var _active:Boolean=true;
private var _os:String;
[Embed(source="images/pc_close_GLOW.png")]
private var win_close_GLOW:Class;
[Embed(source="images/pc_maximize_GLOW.png")]
private var win_maximize_GLOW:Class;
[Embed(source="images/pc_minimize_GLOW.png")]
private var win_minimize_GLOW:Class;
public function AppWindow() {
super();
percentWidth=100;
percentHeight=100;
addEventListener(FlexEvent.CREATION_COMPLETE, layoutWindow);
}
private function layoutWindow(event:FlexEvent):void {
styleName="active";
windowControls=new HBox();
windowControls.addEventListener(MouseEvent.ROLL_OVER, windowControlRollOver);
windowControls.addEventListener(MouseEvent.ROLL_OUT, windowControlRollOut);
winCloseGlow=new Image();
winCloseGlow.visible=false;
winCloseGlow.source=win_close_GLOW;
winMaximizeGlow=new Image();
winMaximizeGlow.visible=false;
winMaximizeGlow.source=win_maximize_GLOW;
winMinimizeGlow=new Image();
winMinimizeGlow.visible=false;
winMinimizeGlow.source=win_minimize_GLOW;
closeButton=new Button();
closeButton.styleName="close";
closeButton.id="close";
closeButton.addEventListener(MouseEvent.CLICK, closeWindow);
closeButton.addEventListener(MouseEvent.ROLL_OVER, controlRollOver);
closeButton.addEventListener(MouseEvent.ROLL_OUT, controlRollOut);
minimizeButton=new Button();
minimizeButton.styleName="minimize";
minimizeButton.id="minimize";
minimizeButton.addEventListener(MouseEvent.CLICK, minimizeWindow);
minimizeButton.addEventListener(MouseEvent.ROLL_OVER, controlRollOver);
minimizeButton.addEventListener(MouseEvent.ROLL_OUT, controlRollOut);
maximizeButton=new Button();
maximizeButton.styleName="maximize";
maximizeButton.id="maximize";
maximizeButton.addEventListener(MouseEvent.CLICK, maximizeWindow);
maximizeButton.addEventListener(MouseEvent.ROLL_OVER, controlRollOver);
maximizeButton.addEventListener(MouseEvent.ROLL_OUT, controlRollOut);
resizeButton=new Button();
resizeButton.styleName="resizeButton";
resizeButton.addEventListener(MouseEvent.MOUSE_DOWN, resizeWindow);
header=new HBox();
header.height=53;
header.addEventListener(MouseEvent.MOUSE_DOWN, moveWindow);
windowControls.addChild(closeButton);
windowControls.addChild(minimizeButton);
windowControls.addChild(maximizeButton);
addChildAt(header, 1);
addChild(winCloseGlow);
addChild(winMinimizeGlow);
addChild(winMaximizeGlow);
addChild(windowControls);
addChild(resizeButton);
}
public function get active():Boolean {
return _active;
}
public function set active(value:Boolean):void {
_active=value;
if (_active) {
closeButton.enabled=true;
minimizeButton.enabled=true;
maximizeButton.enabled=true;
styleName="active";
} else {
closeButton.enabled=false;
minimizeButton.enabled=false;
maximizeButton.enabled=false;
styleName="inactive";
}
invalidateDisplayList();
}
public function get os():String {
return _os;
}
public function set os(value:String):void {
_os=value;
if (_os == "MAC") {
setMacWindow();
windowControls.setChildIndex(closeButton, 0);
windowControls.setChildIndex(minimizeButton, 1);
windowControls.setChildIndex(maximizeButton, 2);
} else {
setWinWindow();
windowControls.setChildIndex(minimizeButton, 0);
windowControls.setChildIndex(maximizeButton, 1);
windowControls.setChildIndex(closeButton, 2);
}
invalidateDisplayList();
}
private function setWinWindow():void {
resizeButton.styleName="resizeButton";
header.styleName="header";
windowControls.styleName="winWindowControl";
winCloseGlow.styleName="glowClose";
winMinimizeGlow.styleName="glowMinimize";
winMaximizeGlow.styleName="glowMaximize";
}
private function setMacWindow():void {
resizeButton.styleName="resizeButton";
header.styleName="header";
windowControls.styleName="macWindowControl";
}
private function moveWindow(event:MouseEvent):void {
NativeApplication.nativeApplication.activeWindow.startMove();
}
private function closeWindow(event:MouseEvent):void {
NativeApplication.nativeApplication.activeWindow.close()
}
private function minimizeWindow(event:MouseEvent):void {
NativeApplication.nativeApplication.activeWindow.minimize()
}
private function resizeWindow(event:MouseEvent):void {
NativeApplication.nativeApplication.activeWindow.startResize()
}
private function maximizeWindow(event:MouseEvent):void {
if (NativeApplication.nativeApplication.activeWindow.displayState == NativeWindowDisplayState.MAXIMIZED) {
NativeApplication.nativeApplication.activeWindow.restore();
} else {
NativeApplication.nativeApplication.activeWindow.maximize();
}
if (_os == "MAC") {
setMacWindow();
} else {
setWinWindow();
}
}
private function windowControlRollOver(event:MouseEvent):void {
event.stopImmediatePropagation();
if (_os == "MAC") {
minimizeButton.selected=true;
maximizeButton.selected=true;
closeButton.selected=true;
}
}
private function windowControlRollOut(event:MouseEvent):void {
event.stopImmediatePropagation();
if (_os == "MAC") {
minimizeButton.selected=false;
maximizeButton.selected=false;
closeButton.selected=false;
}
}
private function controlRollOver(event:MouseEvent):void {
event.stopImmediatePropagation();
if (_os == "WIN") {
if (_active) {
if (event.currentTarget.id == "close") {
winCloseGlow.visible=true;
} else if (event.currentTarget.id == "maximize") {
winMaximizeGlow.visible=true;
} else {
winMinimizeGlow.visible=true;
}
}
}
}
private function controlRollOut(event:MouseEvent):void {
event.stopImmediatePropagation();
if (_os == "MAC")
return;
if (!_active)
return;
if (event.currentTarget.id == "close") {
winCloseGlow.visible=false;
} else if (event.currentTarget.id == "maximize") {
winMaximizeGlow.visible=false;
} else {
winMinimizeGlow.visible=false;
}
}
}
}