Newer
Older
AIR-TUve / src / tvWindow.as
@reddawg reddawg on 5 Dec 2007 16 KB *** empty log message ***
/****************************************************************
 * ucWindow Class, by Christopher Olsen <cwolsen@domainatlantic.com>
 * Copyright 2007 Christopher Olsen
 * 
 * This is the PodWindow container
 * 
 * It handles the following:
 *   Window Resize
 *   Invokes Windows Close Event
 * 
 * It contains the following:
 *   Top margin for window move
 *   Left margine for window move
 *   Minimum window size
 *   Max window size
 *     !! Note: The pod manager can override these values
 * 
 * $Id$
 ***************************************************************/
 
package {
	
  import flash.events.MouseEvent;
  import flash.events.Event;
  import mx.controls.Button;
  import mx.containers.Panel;
  import mx.controls.Image;
  import mx.events.FlexEvent
  import flash.geom.Point;
  import mx.managers.CursorManager;	
  import mx.managers.CursorManagerPriority;
  import mx.core.Application;
  import mx.containers.ApplicationControlBar;
  import mx.controls.ColorPicker;
  import mx.events.ColorPickerEvent;
  import mx.events.DragEvent;
  import mx.core.DragSource;  
  import mx.managers.DragManager;
  
  public class tvWindow extends Panel {
		
	/* Mouse Pointers */
  	[Embed(source="assets/leftObliqueSize.gif")]
    private static var leftObliqueSize:Class;		
  	[Embed(source="assets/rightObliqueSize.gif")]
    private static var rightObliqueSize:Class;
  	[Embed(source="assets/horizontalSize.gif")]
    private static var horizontalSize:Class;
  	[Embed(source="assets/verticalSize.gif")]
    private static var verticalSize:Class;            
    
    /* The close button */
    private var closeButton:Button;
	[Embed(source="assets/closeButtonUp.gif")]
    private var closeButtonUp:Class;    
    [Embed(source="assets/closeButtonOver.gif")]
	private var closeButtonOver:Class;
    [Embed(source="assets/closeButtonDown.gif")]
	private var closeButtonDown:Class;
    /* The min button */
    private var minButton:Button;
	[Embed(source="assets/minButtonUp.gif")]
    private var minButtonUp:Class;    
    [Embed(source="assets/minButtonOver.gif")]
	private var minButtonOver:Class;
    [Embed(source="assets/minButtonDown.gif")]
	private var minButtonDown:Class;
	
    /* The max button */
    private var maxButton:Button;
	[Embed(source="assets/maxButtonUp.gif")]
    private var maxButtonUp:Class;    
    [Embed(source="assets/maxButtonOver.gif")]
	private var maxButtonOver:Class;
    [Embed(source="assets/maxButtonDown.gif")]
	private var maxButtonDown:Class;
	[Embed(source="assets/restButtonUp.gif")]
    private var restButtonUp:Class;    
    [Embed(source="assets/restButtonOver.gif")]
	private var restButtonOver:Class;
    [Embed(source="assets/restButtonDown.gif")]
	private var restButtonDown:Class;
	
	private var mMC:Boolean = false;
	
    private var _pwMin:Boolean = false;
  	private var _stageY: Number;
    private var _startY: Number;
    private var _startX: Number;
    private var _dragStartX: Number;
    private var _dragStartY: Number;
    private var oWidth:Number;
    private var oHeight:Number;	
    //public var myPod:Podz;
    public var closeable:Boolean = true;
    private var resizePoint:Point = new Point();
    private var resizeType:Number = 0;
    public var tvSizable:Boolean = true;    
    
    /* Previous x,y width and height before maximized */
    private var oldX:Number      = 0;
    private var oldY:Number      = 0;
    private var oldWidth:Number  = 0;
    private var oldHeight:Number = 0;
    private var pwButtonVisible:Boolean = false;
    private var pwAttached:Boolean = false;

    
    public function tvWindow() {
      super();
      this.addEventListener(FlexEvent.CREATION_COMPLETE, pwInit);
      this.addEventListener(MouseEvent.MOUSE_DOWN, mouseClickHandler, false);
  	  this.addEventListener(MouseEvent.MOUSE_MOVE, oMouseMove, false);
  	  this.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler,true);
	  this.setStyle("borderThicknessTop",0);
  	  this.setStyle("borderThicknessBottom",0);
  	  this.setStyle("borderThicknessLeft",0);
	  this.setStyle("borderThicknessRight",0);
	  this.setStyle("headerHeight",20);
	  this.setStyle("borderAlpha",.75);
	  this.setStyle("borderColor","#808080");
      } /* end Pod Window */
      
    /******************************************************
    * Handlers Section
    * 
    ******************************************************/
    private function pwMouseOver(event:MouseEvent):void {
      pwShowButtons();
      }
      
    private function pwMouseOut(event:MouseEvent):void {
      pwHideButtons();
      }
      
    private function pwInit(event:FlexEvent):void {
      titleBar.addEventListener(MouseEvent.MOUSE_OVER, pwMouseOver,false,0,true);
	  titleBar.addEventListener(MouseEvent.MOUSE_OUT, pwMouseOut,false,0,true);
      }
      
    /*
     This function attaches the buttons to the PodWindow
    */
    
    public function pwAttachButtons():void {
      var nC:Boolean = false;
      
      /*
      if (myPod != null)
        nC = myPod.podzMaster.podzManager.nC;
      */
      
      if ((closeButton == null) && (nC == false)) {
        closeButton = new Button();
  	    closeButton.width=10;
	    closeButton.height=10;
	    closeButton.focusEnabled=false;
	    closeButton.setStyle("upSkin", closeButtonUp);
	    closeButton.setStyle("overSkin", closeButtonOver);
	    closeButton.setStyle("downSkin", closeButtonDown);
  	    closeButton.addEventListener(MouseEvent.CLICK, closeButtonHandler);
	    titleBar.addChild(closeButton);   
	    }
	  else if ((closeButton != null) && (closeable == false)) {
	  	titleBar.removeChild(closeButton);
	  	closeButton.removeEventListener(MouseEvent.CLICK,closeButtonHandler);
	  	closeButton = null;
	    }
	    
	  if ((maxButton == null) && (tvSizable == true)) {
        maxButton = new Button();
  	    maxButton.width=10;
	    maxButton.height=10;
	    maxButton.focusEnabled=false;
	    maxButton.setStyle("upSkin", maxButtonUp);
	    maxButton.setStyle("overSkin", maxButtonOver);
	    maxButton.setStyle("downSkin", maxButtonDown);
  	    maxButton.addEventListener(MouseEvent.CLICK, maxButtonHandler);
	    titleBar.addChild(maxButton);
	    }
	    
	  if ((minButton == null) && (tvSizable == true)) {
        minButton = new Button();
  	    minButton.width=10;
	    minButton.height=10;
	    minButton.focusEnabled=false;
	    minButton.setStyle("upSkin", minButtonUp);
	    minButton.setStyle("overSkin", minButtonOver);
	    minButton.setStyle("downSkin", minButtonDown);
  	    minButton.addEventListener(MouseEvent.CLICK, minButtonHandler);
	    titleBar.addChild(minButton);
	    }

	  pwAttached = true;
  	  alignButtons();
      } /* end addButtons */ 
  
          
    // Event handler for mouse over moves
    private function oMouseMove(event:MouseEvent):void {
      var contentPoint:Point = event.currentTarget.globalToContent(new Point(event.stageX, event.stageY));
      
      if (_pwMin == true)
        return;
    
      if ((contentPoint.y > event.currentTarget.height - 40) && (contentPoint.x > event.currentTarget.width - 30)){
        CursorManager.removeCursor(CursorManager.currentCursorID);
        CursorManager.setCursor(leftObliqueSize,CursorManagerPriority.MEDIUM, -6, -6);     	
        mMC = true;
        }
     else if ((contentPoint.y < -15) && (contentPoint.x > event.currentTarget.width - 5)) {
       CursorManager.removeCursor(CursorManager.currentCursorID);
       CursorManager.setCursor(rightObliqueSize,CursorManagerPriority.MEDIUM, -6, -6);
       mMC = true;
       }
     else if (mMC == true) {
        CursorManager.removeCursor(CursorManager.currentCursorID);
        mMC = false;
        }
      } /* End oMouseMose */
    
    // Event handler to do actual resize
    private function pwDoResize(event:MouseEvent):void {
      var xPlus:Number = Application.application.parent.mouseX - resizePoint.x;
	  var yPlus:Number = Application.application.parent.mouseY - resizePoint.y;
	  var newY:Number;
	  
      switch (resizeType) {
      	case 1:
          this.width = oWidth + xPlus > 0 ? oWidth + xPlus : this.width;
          this.height = oHeight + yPlus > 0 ? oHeight + yPlus : this.height;
          break;
        case 2:
          this.width = oWidth + xPlus > 0 ? oWidth + xPlus : this.width;

          newY = _startY + event.stageY - _stageY;
          if (newY >= 1) {
          	this.y = newY;
          	this.height = oHeight - yPlus > 0 ? oHeight - yPlus : this.height;
            }
            
          break;
        }
      /* re-align the buttons */
      alignButtons();
      }
       
    // Event handler to end resize
    private function pwEndResize(event:MouseEvent):void {
      var xPlus:Number = Application.application.parent.mouseX - resizePoint.x;
	  var yPlus:Number = Application.application.parent.mouseY - resizePoint.y;
	  var newY:Number;
	    	
      event.stopImmediatePropagation();
      
	  Application.application.parent.removeEventListener(MouseEvent.MOUSE_MOVE, pwDoResize, true);
      Application.application.parent.removeEventListener(MouseEvent.MOUSE_UP, pwEndResize, true);
           
      switch (resizeType) {
      	case 1:
          this.width = oWidth + xPlus > 0 ? oWidth + xPlus : this.width;
          this.height = oHeight + yPlus > 0 ? oHeight + yPlus : this.height;
          break;
        case 2:
          this.width = oWidth + xPlus > 0 ? oWidth + xPlus : this.width;

          newY = _startY + event.stageY - _stageY;
          if (newY >= 1) {
          	this.y = newY;
          	this.height = oHeight - yPlus > 0 ? oHeight - yPlus : this.height;
            }

          break;
        }
      /* re-align the buttons */
      alignButtons();
      
      /* Unset resizeType incase event is still in propagation */
      resizeType = 0;
        
      } /* End pwEndResize */
    
    private function mouseOutHandler(event:MouseEvent):void {
      CursorManager.removeCursor(CursorManager.currentCursorID);
      }
      
    // Event handler for mouse click
    private function mouseClickHandler(event:MouseEvent):void {
      var contentPoint:Point = event.currentTarget.globalToContent(new Point(event.stageX, event.stageY));
      //podParent.setChildIndex(event.currentTarget,podParent.numChildren-1);
      this.parentDocument.setChildIndex(event.currentTarget,this.parentDocument.numChildren-1);

      if ((contentPoint.y > this.height - 40) && (contentPoint.x > this.width - 30) && (tvSizable == true)){
        _dragStartX = event.localX;
        _dragStartY = event.localY;
        
        oWidth = event.currentTarget.width;
        oHeight = event.currentTarget.height;
        
        resizePoint = event.currentTarget.localToGlobal(new Point(event.currentTarget.mouseX,event.currentTarget.mouseY));
        
        resizeType = 1;
        
    	Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, pwEndResize, true);
        Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, pwDoResize, true);
        }
      else if ((contentPoint.y < -15) && (contentPoint.x >  this.width - 5) && (tvSizable == true)) {
      	_dragStartX = event.localX;
      	_dragStartY = event.localY;
      	
      	_startY = event.currentTarget.y;
      	_stageY = event.stageY;
      	
      	oWidth = event.currentTarget.width
      	oHeight = event.currentTarget.height;
      	resizePoint = event.currentTarget.localToGlobal(new Point(event.currentTarget.mouseX,event.currentTarget.mouseY));
      	resizeType = 2;
      	Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, pwEndResize, true);
        Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, pwDoResize, true);
        }
      else if ((contentPoint.y < 0) && (contentPoint.x < (event.currentTarget.width - 5))) {
        Application.application.parent.addEventListener(MouseEvent.MOUSE_UP, podEndMove, true);
        Application.application.parent.addEventListener(MouseEvent.MOUSE_MOVE, podDoMove, true);
  	    _startX = event.currentTarget.x;
        _startY = event.currentTarget.y;
        _dragStartX = event.stageX;
        _dragStartY = event.stageY;
        }
        
        
      } /* End hMouseClick */
   
	public function closeButtonHandler(event:MouseEvent):void{       
	  dispatchEvent(new FlexEvent("closeWindow"));        
	  } /* end buttonCloseHandler */
	  
	private function minButtonHandler(event:MouseEvent):void {
      this.oldHeight = this.height;
      this.oldWidth = this.width;
      this.oldY = this.y;
      
      this.height = this.titleBar.height;

      maxButton.setStyle("upSkin", restButtonUp);
	  maxButton.setStyle("overSkin", restButtonOver);
	  maxButton.setStyle("downSkin", restButtonDown);
	  
	  _pwMin = true;

	  } /* End minButtonHandler() */
	  
	private function maxButtonHandler(event:MouseEvent):void {
	  if (this.oldY != 0) {
	  	if (_pwMin != true) {
	  	  this.x      = this.oldX;
	  	  this.y      = this.oldY;
	  	  }
	  	else
	  	  _pwMin = false;

	  	this.height = this.oldHeight;
	  	this.width  = this.oldWidth;
	  	this.oldY   = 0;
	    maxButton.setStyle("upSkin", maxButtonUp);
	    maxButton.setStyle("overSkin", maxButtonOver);
	    maxButton.setStyle("downSkin", maxButtonDown);	  	
	    }
	  else {
	    this.oldX = this.x;
	    this.oldY = this.y;
	    this.oldHeight = this.height;
	    this.oldWidth = this.width;
	    this.width = this.parentDocument.width - 2;
	    this.height = this.parentDocument.height - 23;
	    this.y = 1;
	    this.x = 1;
	    maxButton.setStyle("upSkin", restButtonUp);
	    maxButton.setStyle("overSkin", restButtonOver);
	    maxButton.setStyle("downSkin", restButtonDown);
	    }
	    
      resizeType = 0;

      this.titleBar.width = this.width;
	  alignButtons();      
	  } /* End maxButtonHandler() */
	  
	/******************************************************
	 * Private functions to the new container class
	 * 
	 *****************************************************/
    public function pwHideButtons():void {
      
      if (closeButton != null)
        closeButton.visible = false;
        
      if (maxButton != null)
      	maxButton.visible = false;
      	
      if (minButton != null)
        minButton.visible = false;

      pwButtonVisible = false;
      }
      	 
    public function pwShowButtons():void {
      if (pwAttached == false)
        pwAttachButtons();
      
      if (closeButton != null)
        closeButton.visible = true;
        
      if (maxButton != null)
      	maxButton.visible = true;
      	
      if (minButton != null)
        minButton.visible = true;

      pwButtonVisible = true;
      }
      
    private function alignButtons():void {
      var bcnt:Number = 1;
      
      if (closeButton != null) {
        closeButton.move(titleBar.width - (bcnt * 16), (titleBar.height - 10) / 2);
        bcnt++;
        }
      if (maxButton != null) {
      	maxButton.move(titleBar.width - (bcnt * 16), (titleBar.height - 10) / 2);
      	bcnt++;
        }
      if (minButton != null) {
        minButton.move(titleBar.width - (bcnt * 16), (titleBar.height - 10) / 2);
        bcnt++;
        }

        
      if (pwButtonVisible == true)
        pwShowButtons();
      else
        pwHideButtons();
      }
      
      /*************/
    private function podDoMove(event:MouseEvent):void {
      var newY:Number;
      var newX:Number;
  	  event.stopImmediatePropagation();
  	  
  	  newY = _startY + event.stageY - _dragStartY;
  	  newX = _startX + event.stageX - _dragStartX;
  	  
	  if (newY > 1 && newX > 1)
        move(newX,newY);
      else if (newY > 1 && newX < 1)
        move(1,newY);
      else if (newY < 1 && newX < 1)
        move(1,1);
      else
        move(newX,1);
  	  } /* End podDoMove */
  	     
    // Event handler to end moving
    private function podEndMove(event:MouseEvent):void {
 	  var newY:Number;
 	  var newX:Number;
 	  
  	  event.stopImmediatePropagation();
	  Application.application.parent.removeEventListener(MouseEvent.MOUSE_MOVE, podDoMove, true);
      Application.application.parent.removeEventListener(MouseEvent.MOUSE_UP, podEndMove, true);
    
  	  newY = _startY + event.stageY - _dragStartY;
  	  newX = _startX + event.stageX - _dragStartX;
  	  
	  if (newY > 22 && newX > 1)
        move(newX,newY);
      else if (newY > 1 && newX < 1)
        move(1,newY);
      else if (newY < 1 && newX < 1)
        move(1,1);
      else
        move(newX,1);
      } /* End podEndMove */      
      /*************/
      
	} /* end class */
	
  } /* end package */