package comp { import flash.events.MouseEvent; import mx.containers.Box; import mx.controls.Button; import mx.managers.CursorManager; import mx.managers.CursorManagerPriority; public class ResizableBox extends Box { [Embed("icons/resize_handle.png")] private var resizeCursor: Class; private var _resizeButtonRight: Button; private var _resizeButtonLeft: Button; private var _clickedX: Number; private var _resizing: Boolean; private var _debug: Boolean = false; //turn on/off to see the magic public function ResizableBox() { super(); } override protected function createChildren(): void { super.createChildren(); if (_resizeButtonRight == null) { _resizeButtonRight = new Button(); _resizeButtonRight.width = 10; if (!_debug) _resizeButtonRight.alpha = 0; rawChildren.addChild(_resizeButtonRight); _resizeButtonRight.addEventListener(MouseEvent.MOUSE_DOWN, resizeRightDown); _resizeButtonRight.addEventListener(MouseEvent.MOUSE_OVER, showResizeIcon); //show resize icon handler _resizeButtonRight.addEventListener(MouseEvent.MOUSE_OUT, hideResizeIcon); //hide resize icon handler } if (_resizeButtonLeft == null) { _resizeButtonLeft = new Button(); _resizeButtonLeft.width = 10; if (!_debug) _resizeButtonLeft.alpha = 0; rawChildren.addChild(_resizeButtonLeft); _resizeButtonLeft.addEventListener(MouseEvent.MOUSE_DOWN, resizeLeftDown); _resizeButtonLeft.addEventListener(MouseEvent.MOUSE_OVER, showResizeIcon); //show resize icon handler _resizeButtonLeft.addEventListener(MouseEvent.MOUSE_OUT, hideResizeIcon); //hide resize icon handler } // move the box: this.addEventListener(MouseEvent.MOUSE_DOWN, moveDown); _resizing = false; } override protected function updateDisplayList(width:Number, height:Number): void { super.updateDisplayList(width, height); _resizeButtonRight.x = width - _resizeButtonRight.width/2; _resizeButtonRight.height = this.height; _resizeButtonLeft.x = - _resizeButtonLeft.width/2; _resizeButtonLeft.height = this.height; } private function resizeRightDown(e:MouseEvent): void { _resizing = true; //so you cant move the box when clicking a resize-region stage.addEventListener(MouseEvent.MOUSE_MOVE, scaleRightBox); stage.addEventListener(MouseEvent.MOUSE_UP, stopRightScale); } private function scaleRightBox(e:MouseEvent): void { var newWidth: Number = this.mouseX; //this.mouseX is the X position of the mouse relative to the component // to prevent the width from being a negative value: if (newWidth > this.minWidth && newWidth < this.maxWidth) changeWidth(newWidth); } private function stopRightScale(e:MouseEvent): void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, scaleRightBox); stage.removeEventListener(MouseEvent.MOUSE_UP, stopRightScale); _resizing = false; } private function resizeLeftDown(e:MouseEvent): void { _resizing = true; stage.addEventListener(MouseEvent.MOUSE_MOVE, scaleLeftBox); stage.addEventListener(MouseEvent.MOUSE_UP, stopLeftScale); } private function scaleLeftBox(e:MouseEvent): void { var newWidth: Number = this.width - this.mouseX; // to prevent the widht from being a negative value: if (newWidth > this.minWidth && newWidth < this.maxWidth) { changeXplusWidth(this.x + this.mouseX, newWidth); stage.invalidate(); //extra refresh } } private function stopLeftScale(e:MouseEvent): void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, scaleLeftBox); stage.removeEventListener(MouseEvent.MOUSE_UP, stopLeftScale); _resizing = false; } private function showResizeIcon(e:MouseEvent): void { CursorManager.setCursor(resizeCursor, CursorManagerPriority.MEDIUM, -9, -5); } private function hideResizeIcon(e:MouseEvent): void { CursorManager.removeAllCursors(); } public function startMoving(): void { this.moveDown(new MouseEvent("mouseDown")); } // Handlers to move the box: private function moveDown(e:MouseEvent): void { if (!_resizing) { _clickedX = this.mouseX; stage.addEventListener(MouseEvent.MOUSE_MOVE, moveBox); stage.addEventListener(MouseEvent.MOUSE_UP, stopMove); //stage.addEventListener(MouseEvent.MOUSE_OUT, stopMove); stage.invalidate(); } } private function moveBox(e:MouseEvent): void { changeX(parent.mouseX - _clickedX); } private function stopMove(e:MouseEvent): void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveBox); stage.removeEventListener(MouseEvent.MOUSE_UP, stopMove); //stage.removeEventListener(MouseEvent.MOUSE_OUT, stopMove); } protected function changeWidth(value: Number): void { this.width = value; } protected function changeX(value: Number): void { this.x = value; } protected function changeXplusWidth(x: Number, width:Number): void { this.x = x; this.width = width; } } }