topical media & game development

talk show tell print

actionscript-omr-lib-DragPanel.ax

actionscript-omr-lib-DragPanel.ax [swf] flex


  package 
  {
      import mx.containers.Panel;
      import mx.core.UIComponent;
      import mx.core.SpriteAsset;
      import mx.events.FlexEvent;
      import flash.events.MouseEvent;
      import flash.events.Event;
  
      public class @ax-actionscript-omr-lib-DragPanel extends Panel
      {
          // Add the creationCOmplete event handler.
          public function @ax-actionscript-omr-lib-DragPanel()
          {
              super();
              addEventListener(FlexEvent.CREATION_COMPLETE, creationCompleteHandler);
          }
          
          private var myTitleBar:UIComponent;
                      
          private function creationCompleteHandler(event:Event):void
          {
              myTitleBar = titleBar;            
              // Add the resizing event handler.    
              addEventListener(MouseEvent.MOUSE_DOWN, resizeHandler);
              myTitleBar.addEventListener(MouseEvent.MOUSE_DOWN, tbMouseDownHandler);
              myTitleBar.addEventListener(MouseEvent.MOUSE_UP, tbMouseUpHandler);
              
              
          }
          
          private var xOff:Number;
             private var yOff:Number;
              
          private function tbMouseDownHandler(event:MouseEvent):void {
              
                  xOff = event.currentTarget.mouseX;
                  yOff = event.currentTarget.mouseY;
                  parent.addEventListener(MouseEvent.MOUSE_MOVE, tbMouseMoveHandler);
                  parent.setChildIndex(this,parent.numChildren-1); 
                  
              }
              
         private function tbMouseMoveHandler(event:MouseEvent):void {
              
              // Compensate for the mouse pointer's location in the title bar.
              
              var tempX:int = parent.mouseX - xOff;
              x = tempX;
              
              var tempY:int = parent.mouseY - yOff;
              y = tempY;    
                      
          }
          
          private function tbMouseUpHandler(event:MouseEvent):void {
  
             parent.removeEventListener(MouseEvent.MOUSE_MOVE, tbMouseMoveHandler);    
          
          }
          
          
          
  
          protected var minShape:SpriteAsset;
          protected var restoreShape:SpriteAsset;
  
          override protected function createChildren():void
          {
                  super.createChildren();
              
              // Create the SpriteAsset's for the min/restore icons and 
              // add the event handlers for them.
              minShape = new SpriteAsset();
              minShape.addEventListener(MouseEvent.MOUSE_DOWN, minPanelSizeHandler);
              titleBar.addChild(minShape);
  
              restoreShape = new SpriteAsset();
              restoreShape.addEventListener(MouseEvent.MOUSE_DOWN, restorePanelSizeHandler);
              titleBar.addChild(restoreShape);
          }
              
          override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
          {
              super.updateDisplayList(unscaledWidth, unscaledHeight);
              
              // Create invisible rectangle to increase the hit area of the min icon.
              minShape.graphics.clear();
              minShape.graphics.lineStyle(0, 0, 0);
              minShape.graphics.beginFill(0xFFFFFF, 0.0);
              minShape.graphics.drawRect(unscaledWidth - 35, 12, 8, 8);
  
              // Draw min icon.
              minShape.graphics.lineStyle(2);
              minShape.graphics.beginFill(0xFFFFFF, 0.0);
              minShape.graphics.drawRect(unscaledWidth - 35, 18, 8, 2);
                  
              // Draw restore icon.
              restoreShape.graphics.clear();
              restoreShape.graphics.lineStyle(2);
              restoreShape.graphics.beginFill(0xFFFFFF, 0.0);
              restoreShape.graphics.drawRect(unscaledWidth - 20, 12, 8, 8);
              restoreShape.graphics.moveTo(unscaledWidth - 20, 15);
              restoreShape.graphics.lineTo(unscaledWidth - 12, 15);
  
              // Draw resize graphics if not minimzed.                
              graphics.clear()
              if (isMinimized == false)
              {
                  graphics.lineStyle(2);
                  graphics.moveTo(unscaledWidth - 6, unscaledHeight - 1)
                  graphics.curveTo(unscaledWidth - 3, unscaledHeight - 3, unscaledWidth - 1, unscaledHeight - 6);                        
                  graphics.moveTo(unscaledWidth - 6, unscaledHeight - 4)
                  graphics.curveTo(unscaledWidth - 5, unscaledHeight - 5, unscaledWidth - 4, unscaledHeight - 6);                        
              }
          }
                      
          private var myRestoreHeight:int;
          private var isMinimized:Boolean = false; 
                      
          // Minimize panel event handler.
          private function minPanelSizeHandler(event:Event):void
          {
              if (isMinimized != true)
              {
                  myRestoreHeight = height;    
                  height = titleBar.height;
                  isMinimized = true;    
                  // Don't allow resizing when in the minimized state.
                  removeEventListener(MouseEvent.MOUSE_DOWN, resizeHandler);
              }                
          }
          
          // Restore panel event handler.
          private function restorePanelSizeHandler(event:Event):void
          {
              if (isMinimized == true)
              {
                  height = myRestoreHeight;
                  isMinimized = false;    
                  // Allow resizing in restored state.                
                  addEventListener(MouseEvent.MOUSE_DOWN, resizeHandler);
              }
          }
  
          // Define static constant for event type.
          //public static const RESIZE_CLICK:String = "resizeClick";
  
          // Resize panel event handler.
          private var origWidth:int;
          private var origHeight:int;
          
          public  function resizeHandler(event:MouseEvent):void
          {
              // Determine if the mouse pointer is in the lower right 7x7 pixel
              // area of the panel. Initiate the resize if so.
              
              // Lower left corner of panel
              var lowerLeftX:Number = x + width; 
              var lowerLeftY:Number = y + height;
                  
              // Upper left corner of 7x7 hit area
              var upperLeftX:Number = lowerLeftX-7;
              var upperLeftY:Number = lowerLeftY-7;
                  
              // Mouse positionin Canvas
              var panelRelX:Number = event.localX + x;
              var panelRelY:Number = event.localY + y;
  
              // See if the mousedown is in the lower right 7x7 pixel area
              // of the panel.
              if (upperLeftX <= panelRelX && panelRelX <= lowerLeftX)
              {
                  if (upperLeftY <= panelRelY && panelRelY <= lowerLeftY)
                  {    
                  
                      
                      event.stopPropagation();        
                      
                      origWidth = width;
                      origHeight = height;
                      xOff = parent.mouseX;
                      yOff = parent.mouseY;
                      parent.addEventListener(MouseEvent.MOUSE_MOVE, resizePanel);
                      parent.addEventListener(MouseEvent.MOUSE_UP, stopResizePanel);
                      
                  }
              }                
          }
          
          private function resizePanel(event:MouseEvent):void {
              
              if ((origWidth + (parent.mouseX - xOff)) > 250){
                  width = origWidth + (parent.mouseX - xOff);    
              }
              
              if ((origHeight + (parent.mouseY - yOff)) > titleBar.height){
                  height = origHeight + (parent.mouseY - yOff);
              }
                      
          }
          
          private function stopResizePanel(event:MouseEvent):void {
              parent.removeEventListener(MouseEvent.MOUSE_MOVE, resizePanel);
          }
          
                  
      }
  }


(C) Æliens 27/08/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.