Window Management Interface

by hemingway
wrote this the other night for fun, clearly unfinished but busy with other things. do what you wish with it!
♥0 | Line 407 | Modified 2012-10-31 02:22:21 | MIT License
play

ActionScript3 source code

/**
 * Copyright hemingway ( http://wonderfl.net/user/hemingway )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/38xh
 */

package { 
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;

    [SWF(frameRate = 60, width = 800, height = 600)]
    public class WLD_WindowInterface extends Sprite
    {
        internal var backGround:Sprite = new Sprite();
        internal var foreGround:Sprite = new Sprite();
        internal var btnAddWind:Button = new Button(WLD_WindowInterface(this));
        
        //internal var testWindow:Window = new Window(120, 90, 400, 300); now handled by Button class
        
        public var displayArray:Array = new Array();
        public var displayLimit:Number = 20;
        public var dockedCount :Number = 0;
      
        public function WLD_WindowInterface()
        {
            backGround.graphics.lineStyle (1);
            backGround.graphics.drawRect  (0, 0, 799, 599);
            
            foreGround.graphics.lineStyle (1);
            foreGround.graphics.drawRect  (0, 572, 799, 0);
            
            _init();
        }
        
        public function _init(displayList:Array = null, instance:Number = 0) :void
        {
            removeAll();
            
            switch (instance)
            {
                case 0:
                    
                    addChild(btnAddWind);
                    if (displayList != null)
                    {for(var i:Number = 0; i < displayList.length; i++) {addChild(displayList[i])}}
                    
                    break;
                case 1:
                    break;
                case 2:
                    break;
            }
            
            addChild(foreGround);
            addChild(backGround);
        }
        
        public function removeAll() :void
        {
            while ( numChildren )
                  { removeChildAt(0) }
        }
    }
}

import flash.display.*;
import flash.events.*;
import flash.utils.*;
import flash.text.*;
import flash.geom.*;
 
    class Window extends Sprite
    {
        /**********************
         *    CONSTRUCTION    *
         **********************/
        
        internal var WI :WLD_WindowInterface;
        internal var BT :Button;
        
        protected var _x      :Number;
        protected var _y      :Number;
        protected var _width  :Number;
        protected var _height :Number;
        protected var _alpha  :Number;
        protected var _docked :Boolean;
        
        internal var windowHandle :Sprite = new Sprite();
        internal var handleHeight :Number = 26;
        internal var handleAlpha  :Number;
        internal var handleText   :DisplayText;
        
        internal var windowExit :Sprite = new Sprite();
        internal var windowSize :Sprite = new Sprite();
        internal var windowHide :Sprite = new Sprite();
        internal var btnOffset  :Point  = new Point();
        
        internal var firstPoint   :Point = null;
        internal var currentPoint :Point = null;
        internal var calcPoint    :Point = null;
        
        internal var mouseObject :Object;
        
        /**
         * Window constructor
         * @param xPos  : initial X position
         * @param yPos  : initial Y position
         * @param w     : initial width
         * @param h     : initial height
         * @param alpha : initial transparency
         */
        public function Window(windowInterface:WLD_WindowInterface, button:Button, xPos:Number = 0, yPos:Number = 0, w:Number = 400, h:Number = 300, transparency:Number = 0.6)
        {
            addEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            WI = windowInterface;
            BT = button;
            
            _x      = xPos;
            _y      = yPos;
            _width  = w;
            _height = h;
            _alpha  = transparency;
            
            handleAlpha = (_alpha < 0.75) ? (_alpha + 0.25) : 1;
            this.addChild(windowHandle);
            
            handleText = new DisplayText(windowHandle, false, "$testWindow", "Helvetica", 0xCFCFCF);
            
            btnOffset.x = (_width * 0.82);
            btnOffset.y = (handleHeight * 0.87);
            
            windowHandle.addChild(handleText);
            windowHandle.addChild(windowHide);
            windowHandle.addChild(windowSize);
            windowHandle.addChild(windowExit);
        }
        
        /**********************
         *        DRAW        *
         **********************/
        
        public function _init() :void
        {
            graphics.clear();
            windowHandle.graphics.clear();
            windowHide.graphics.clear();
            windowSize.graphics.clear();
            windowExit.graphics.clear();
            
            graphics.lineStyle  (1, 0, _alpha);
            graphics.beginFill  (0xE5F9FF, _alpha);
            graphics.drawRect   (_x, _y, _width, _height);
            graphics.endFill    ();
            
            windowHandle.graphics.beginFill (0x666666,  0.9);
            windowHandle.graphics.drawRect  (_x, (_y - handleHeight), (_width + 1), handleHeight);
            windowHandle.graphics.endFill   ();
            
            handleText.x = (_x + 12);
            handleText.y = (_y - btnOffset.y);
            
            windowHide.graphics.beginFill (0xFFFFCC, handleAlpha);
            windowHide.graphics.drawRect  (_x + (btnOffset.x), _y - (btnOffset.y), 20, 20);
            windowHide.graphics.endFill   ();
            
            windowSize.graphics.beginFill (0xCCFFFF, handleAlpha);
            windowSize.graphics.drawRect  (_x + (btnOffset.x + (_width * 0.06)), _y - (btnOffset.y), 20, 20);
            windowSize.graphics.endFill   ();
            
            windowExit.graphics.beginFill (0xFFCCCC, handleAlpha);
            windowExit.graphics.drawRect  (_x + (btnOffset.x + (_width * 0.12)), _y - (btnOffset.y), 20, 20);
            windowExit.graphics.endFill   ();
        }
        
        /**********************
         *        CODE        *
         **********************/
        
        public function removeWindow() :void
        {
            for (var i:Number = 0; i < (WI.displayArray.length); i++)
            { if (WI.displayArray[i] == this) { WI.displayArray.splice(i, 1) }}
            WI._init(WI.displayArray);        
        }
        
        public function bringToFront() :void
        {
            WI.setChildIndex(this, (WI.numChildren - 2));
        }
        
        /**********************
         *       EVENTS       *
         **********************/
        
        public function addedToStage($e:Event) :void
        {
            _init();
            
            addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
            addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }
        
        public function onMouseOver($e:MouseEvent) :void
        {
            stage.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
            
            switch ($e.target)
            {
                case windowHide:
                    
                    windowHide.alpha = 0.75;
                    
                    break;
                
                case windowSize:
                    
                    windowSize.alpha = 0.75;
                    
                    break;
                
                case windowExit:
                    
                    windowExit.alpha = 0.75;
                    
                    break;
            }
        }
        
        public function onMouseOut($e:MouseEvent) :void
        {
            if (parent)
            {
                stage.removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);    
            
                windowExit.alpha = 1;
                windowSize.alpha = 1;
                windowHide.alpha = 1;
            }
        }
        
        public function onMouseDown($e:MouseEvent) :void
        {
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            
            mouseObject = $e.target;
            
            firstPoint = new Point($e.stageX, $e.stageY);
            
            switch ($e.target)
            {
                case windowHandle:
                    
                    if (_docked)
                    { 
                        _docked = false;
                        --WI.dockedCount;
                    }
                    
                    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
                    bringToFront();
                    
                    break;
            }
        }
        
        public function onMouseMove($e:MouseEvent) :void
        {
            if (($e.stageX > 0) && ($e.stageY > 0) && ($e.stageX < 800) && ($e.stageY < 600))
            {
                currentPoint = new Point($e.stageX, $e.stageY);
                calcPoint = currentPoint.subtract(firstPoint);
                
                x = (x + calcPoint.x);
                y = (y + calcPoint.y);
                
                firstPoint = currentPoint;
            }
        }
        
        public function onMouseUp($e:MouseEvent) :void
        {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
            stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            
            switch($e.target)
            {
                case mouseObject:
                    
                    switch (mouseObject)
                    {
                        case windowHide:
                            
                            _docked = true;
                            
                            windowHandle.parent.alpha = 0;
                            windowHide.visible = false;
                            windowSize.visible = false;
                            
                            width *= 0.33; 
                            windowExit.x -= width * 1.78;
                            x = 28 + (134 * (WI.dockedCount));
                            y = 599;
                            
                            ++WI.dockedCount;
                            
                            break;
                        
                        case windowSize:
                            
                            windowHandle.parent.alpha = 0.6;
                            
                            break;
                        
                        case windowExit:
                            
                            if (_docked)
                            {
                                _docked = false;
                                --WI.dockedCount;
                            }
                            removeWindow();
                            
                            break;
                    }
                    
                    break;
            }
        }
        
        public function onEnterFrame($e:Event) :void
        {
            
        }
        
        /**********************
         *   GETTERS/SETTERS  *
         **********************/
        
        public override function get x() :Number
        { return _x }
        
        public override function get y() :Number
        { return _y }
        
        public override function get width() :Number
        { return _width }
        
        public override function get height() :Number
        { return _height }
        
        public override function get alpha() :Number
        { return _alpha }
        
        public function get docked() :Boolean
        { return _docked }

        public override function set x(value:Number) :void
        {
            _x = value;
            _invalidate();
        }
        
        public override function set y(value:Number) :void
        {
            _y = value;
            _invalidate();
        }
        
        public override function set width(value:Number) :void
        {
            _width = value;
            _invalidate();
        }
        
        public override function set height(value:Number) :void
        {
            _height = value;
            _invalidate();
        }
        
        public override function set alpha(value:Number) :void
        {
            _alpha = value;
            _invalidate();
        }
        
        /**********************
         *    INVALIDATION    *
         **********************/
        
        private function _invalidate() :void
        {
            if  (!hasEventListener(Event.ENTER_FRAME) )
                { addEventListener(Event.ENTER_FRAME, _invalidateCallback) }
        }
        
        private function _invalidateCallback($e:Event) :void
        {
            removeEventListener(Event.ENTER_FRAME, _invalidateCallback);
            _init();
        }
        
        public function refresh() :void
        { _invalidate() }
    }
    
    class Button extends Sprite
    {
        /**********************
         *    CONSTRUCTION    *
         **********************/
        
        internal var WI :WLD_WindowInterface;
        
        private var buttonCross :Sprite;
        
        protected var _x      :Number;
        protected var _y      :Number;
        protected var _width  :Number;
        protected var _height :Number;
        protected var _alpha  :Number;
        
        internal var mouseObject :Object;
        internal var testWindow  :Window;
        
        /**
         * Button constructor
         * @param xPos  : initial X position
         * @param yPos  : initial Y position
         * @param w     : initial width
         * @param h     : initial height
         * @param alpha : initial transparency
         */
        public function Button(windowInterface:WLD_WindowInterface, xPos:Number = 2, yPos:Number = 574, w:Number = 24, h:Number = 24, transparency:Number = 0.7)
        {
            addEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            WI = windowInterface;
            
            _x         = xPos;
            _y         = yPos;
            _width  = w;
            _height = h;
            _alpha  = transparency;
        }
        
        /**********************
         *        DRAW        *
         **********************/
        
        public function _init() :void
        {
            graphics.lineStyle (2, 0x666666, 1);
            graphics.beginFill (0xE5F9FF, _alpha);
            graphics.drawRect  (_x, _y, _width, _height);
            graphics.endFill   ();
        }
        
        /**********************
         *        CODE        *
         **********************/
        
        public function addWindow() :void
        {
            if (WI.displayArray.length < WI.displayLimit)
            {
                testWindow = new Window(WI, this, 0 + (WI.displayArray.length * 26), 26 + (WI.displayArray.length * 26));
                WI.displayArray.push(testWindow);
                WI._init(WI.displayArray);
            }
        }
        
        /**********************
         *       EVENTS       *
         **********************/
        
        public function addedToStage($e:Event) :void
        {
            _init();
            
            addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
        }
        
        public function onMouseDown($e:MouseEvent) :void
        {
            stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
            
            mouseObject = $e.target;
            mouseObject.alpha = (_alpha / 2);
        }
        
        public function onMouseUp($e:MouseEvent) :void
        {
            if ($e.target == mouseObject)
            {
                addWindow();
            }
            
            mouseObject.alpha = _alpha;
        }
    }
    
    class DisplayText extends TextField
    {
        /**********************
         *    CONSTRUCTION    *
         **********************/

        private var _text  :String;
        private var _textF :String;
        
        private var _color :Number;
        private var _size  :Number;
        
        private var _x      :Number;
        private var _y      :Number;
        
        private var _bold   :Boolean;
        
        internal var _frameCount :Boolean;
        internal var _frameNum   :Number;
            
        internal var first :uint = getTimer();
        
        public function DisplayText (
                                    parent:Object, frameCount :Boolean= false,
                                    text  :String = "", textF :String = "Helvetica",
                                    color :Number = 0 , size  :Number = 12,
                                    x     :Number = 0 , y     :Number =  0,
                                    bold  :Boolean = false
                                    )
        {
            addEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            _text  = text;
            _textF = textF;
            _size  = size;
            
            _color = color;
            
            if (x == 0 && y == 0)
            {
                _x = (parent.x + 12);
                _y = (parent.y + 5);
            }else{
                _x = x;
                _y = y;
            }
            
            _bold = bold;
            
            _frameCount = frameCount;
            
            mouseEnabled = false;
            selectable   = false;
            
            draw();
        }
            
        /**********************
         *        DRAW        *
         **********************/
            
        public function draw() :void
        {
            var textFormat:TextFormat = new TextFormat(_textF, _size, _color, _bold);
            
            text = _text;
            x    = _x;
            y    = _y;
            
            setTextFormat(textFormat);
            
            width  = (4 + textWidth);
            height = (4 + textHeight);
        }
            
        /**********************
         *        CODE        *
         **********************/
            
        public function frameCount() :void
        {
            var last  :uint = getTimer();
            var delta :uint = (last - first);
            
            if (delta > 1000)
            {
                var fps :uint = (_frameNum / delta) * 1000;
                
                text = ("FPS: " + fps);
                
                _frameNum = 0;
                
                first = last;
            }
        }
            
        /**********************
         *       EVENTS       *
         **********************/
            
        public function addedToStage($e:Event) :void
        {
            if  ( _frameCount )
                { stage.addEventListener(Event.ENTER_FRAME, onEnterFrame) }
        }
        
        public function onEnterFrame($e:Event) :void
        {
            _frameNum ++;
            
            frameCount();
        }
    }