<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    xmlns:flexlib="http://code.google.com/p/flexlib/"
    
    modalTransparency=".8" modalTransparencyColor="0x000000"
    creationComplete="addKeyboardListeners();" viewSourceURL="srcview/index.html">
    
    <mx:Script>
        <![CDATA[
            import flexlib.mdi.effects.effectsLib.MDIVistaEffects;
            import mx.managers.PopUpManager;
            import mx.core.UIComponent;
            import mx.core.Container;
            import com.dougmccune.containers.VistaFlowContainer;
                    
            
            private var vistaFlow:VistaFlowContainer;
            
            private function addWindow():void
            {
                var win:MDIWindow = new MDIWindow();
                win.width = 350;
                win.title = "Window " + String(mdiCanvas.windowManager.windowList.length + 1);
                mdiCanvas.windowManager.add(win);
            }
            
            private function showVistaFlow():void {
                var windows:Array = mdiCanvas.windowManager.getOpenWindowList();
                var n:int = windows.length;
                
                var maxWidth:Number = 300;
                var maxHeight:Number = 300;
                
                if(vistaFlow) {
                    vistaFlow.removeAllChildren();
                }
                else {
                    vistaFlow = new VistaFlowContainer();
                    vistaFlow.reflectionEnabled = true;
                    vistaFlow.addEventListener(Event.CHANGE, handleVistaChange);
                }
                
                var selectedIndex:int=0;
                
                    
                for(var i:int=0; i<n; i++) {
                    var window:MDIWindow = windows[i];
                    
                    var bitmap:Bitmap;
                    var ratio:Number;
                        
                    if(window.width > maxWidth || window.height > maxHeight) {
                        if(window.width > window.height) {
                            ratio = maxWidth/window.width;
                        }
                        else {
                            ratio = maxHeight/window.height;
                        }
                    }
                    else {
                        ratio = 1;
                    }
                    
                    var container:Container = new Container();
                    var uiComp:UIComponent = new UIComponent();
                    
                    if(window.hasFocus) {
                        selectedIndex = i;
                    }
                    
                    mdiCanvas.windowManager.bringToFront(window);
                    window.validateNow();
                    
                    var matrix:Matrix = new Matrix();
                    matrix.scale(ratio, ratio);
                    
                    var bmapData:BitmapData = new BitmapData(window.width*ratio, window.height*ratio, true, 0x00000000);
                    bmapData.draw(window, matrix, null, null, null, true);
                    
                    bitmap = new Bitmap(bmapData, PixelSnapping.AUTO, true);    
                    
                    uiComp.addChild(bitmap);
                    container.addChild(uiComp);
                    
                    container.width = uiComp.width= window.width*ratio;
                    container.height = uiComp.height = window.height*ratio;
                    
                    vistaFlow.addChild(container);
                }
                
                vistaFlow.selectedIndex = selectedIndex;
                
                vistaFlow.width = this.width;
                vistaFlow.height = this.height;
                PopUpManager.addPopUp(vistaFlow, this, true);
            }
            
            private function removeVistaFlow():void {
                
                var selectedIndex:int = vistaFlow.selectedIndex;
                
                mdiCanvas.windowManager.bringToFront(mdiCanvas.windowManager.getOpenWindowList()[selectedIndex]);
                
                vistaFlow.removeAllChildren();
                PopUpManager.removePopUp(vistaFlow);
            }
            
            private function addKeyboardListeners():void {
                addEventListener(KeyboardEvent.KEY_DOWN, vistaKeyDownHandler);
                addEventListener(KeyboardEvent.KEY_UP, vistaKeyUpHandler);
            }
            
            private function handleVistaChange(event:Event):void {
                var index:int = vistaFlow.selectedIndex;
                mdiCanvas.windowManager.bringToFront(mdiCanvas.windowManager.getOpenWindowList()[index]);
            }
            
            private function vistaKeyDownHandler(event:KeyboardEvent):void {
                if(event.shiftKey && event.keyCode == Keyboard.ENTER) {
                    if(vistaFlow && vistaFlow.isPopUp) {
                        if(vistaFlow.selectedIndex < vistaFlow.numChildren - 1) {
                            vistaFlow.selectedIndex++;
                        }
                        else {
                            vistaFlow.selectedIndex = 0;
                        }
                    }
                    else {
                        showVistaFlow();
                    }
                }
            }
            
            private function vistaKeyUpHandler(event:KeyboardEvent):void {
                if(vistaFlow && vistaFlow.isPopUp && event.keyCode == Keyboard.SHIFT) {
                    removeVistaFlow();    
                }
            }
            
        ]]>
    </mx:Script>
    
    <mx:Style source="WindowsXP_default.css" />
    
    <mx:VBox id="vbox" width="100%" height="100%">
    
        <mx:ApplicationControlBar dock="true" width="100%" height="50" verticalAlign="middle">
            <mx:Button label="Add Window" click="addWindow()" />
            
            <mx:VRule height="35" />
            
            <mx:Button label="Cascade" click="mdiCanvas.windowManager.cascade()" />
            <mx:Button label="Tile" click="mdiCanvas.windowManager.tile(false, 2)" />
            <mx:Button label="Tile + Fill Space" click="mdiCanvas.windowManager.tile(true, 2)" />
        </mx:ApplicationControlBar>
        
        <flexlib:MDICanvas id="mdiCanvas" effectsLib="{MDIVistaEffects}"
            horizontalScrollPolicy="off" verticalScrollPolicy="off" width="100%" height="100%">
            <flexlib:MDIWindow
                title="Window 1 has a really really long title to show support for truncation"
                x="30" y="30" width="400" height="200" />
            <flexlib:MDIWindow
                title="Window 2"
                x="450" y="30" width="250" height="300" />
        </flexlib:MDICanvas>
    </mx:VBox>
</mx:Application>