topical media & game development
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.