package com.senocular.display {
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.utils.Dictionary;
import com.senocular.display.TransformTool;
import com.senocular.display.TransformToolControl;
public class TransformToolCursor extends TransformToolControl {
protected var _mouseOffset:Point = new Point( 20 , 20 );
protected var contact: Boolean = false ;
protected var active: Boolean = false ;
protected var references:Dictionary = new Dictionary( true );
public function get mouseOffset():Point {
return _mouseOffset.clone();
}
public function set mouseOffset(p:Point):void {
_mouseOffset = p;
}
public function TransformToolCursor() {
addEventListener(TransformTool.CONTROL_INIT, init);
}
/**
* Adds a reference to the list of references that the cursor
* uses to determine when to be displayed. Typically this would
* be a TransformToolControl instance used in the transform tool
* @see removeReference
*/
public function addReference(reference:DisplayObject):void {
if (reference && !references[reference]) {
references[reference] = true ;
addReferenceListeners(reference);
}
}
/**
* Removes a reference to the list of references that the cursor
* uses to determine when to be displayed.
* @see addReference
*/
public function removeReference(reference:DisplayObject):DisplayObject {
if (reference && references[reference]) {
removeReferenceListeners(reference);
delete references[reference];
return reference;
}
return null ;
}
/**
* Called when the cursor should determine
* whether it should be visible or not
*/
public function updateVisible(event:Event = null ):void {
if (active) {
if (!visible) {
visible = true ;
}
} else if (visible ! = contact) {
visible = contact;
}
position(event);
}
/**
* Called when the cursor should position itself
*/
public function position(event:Event = null ):void {
if (parent) {
x = parent.mouseX + mouseOffset.x;
y = parent.mouseY + mouseOffset.y;
}
}
private function init(event:Event):void {
_transformTool.addEventListener(TransformTool.TRANSFORM_TOOL, position, false , 0 , true );
_transformTool.addEventListener(TransformTool.NEW_TARGET, referenceUnset, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_TRANSFORM_TOOL, position, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_DOWN, controlMouseDown, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_MOVE, controlMove, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_UP, controlMouseUp, false , 0 , true );
updateVisible(event);
position(event);
}
private function addReferenceListeners(reference:DisplayObject):void {
reference.addEventListener(MouseEvent.MOUSE_MOVE, referenceMove, false , 0 , true );
reference.addEventListener(MouseEvent.MOUSE_DOWN, referenceSet, false , 0 , true );
reference.addEventListener(MouseEvent.ROLL_OVER, referenceSet, false , 0 , true );
reference.addEventListener(MouseEvent.ROLL_OUT, referenceUnset, false , 0 , true );
}
private function removeReferenceListeners(reference:DisplayObject):void {
reference.removeEventListener(MouseEvent.MOUSE_MOVE, referenceMove, false );
reference.removeEventListener(MouseEvent.MOUSE_DOWN, referenceSet, false );
reference.removeEventListener(MouseEvent.ROLL_OVER, referenceSet, false );
reference.removeEventListener(MouseEvent.ROLL_OUT, referenceUnset, false );
}
protected function referenceMove(event:MouseEvent):void {
position(event);
event.updateAfterEvent();
}
protected function referenceSet(event:Event):void {
contact = true ;
if (!_transformTool.currentControl) {
updateVisible(event);
}
}
protected function referenceUnset(event:Event):void {
contact = false ;
if (!_transformTool.currentControl) {
updateVisible(event);
}
}
// the following control methods rely on TransformToolControl.relatedObject
// to tell if a reference is being interacted with and therefore active
protected function controlMouseDown(event:Event):void {
if (references[_transformTool.currentControl.relatedObject]) {
active = true ;
// ~ contact = true ;
}
updateVisible(event);
}
protected function controlMove(event:Event):void {
if (references[_transformTool.currentControl.relatedObject]) {
position(event);
}
}
protected function controlMouseUp(event:Event):void {
if (references[_transformTool.currentControl.relatedObject]) {
active = false ;
}
updateVisible(event);
}
}
}
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.utils.Dictionary;
import com.senocular.display.TransformTool;
import com.senocular.display.TransformToolControl;
public class TransformToolCursor extends TransformToolControl {
protected var _mouseOffset:Point = new Point( 20 , 20 );
protected var contact: Boolean = false ;
protected var active: Boolean = false ;
protected var references:Dictionary = new Dictionary( true );
public function get mouseOffset():Point {
return _mouseOffset.clone();
}
public function set mouseOffset(p:Point):void {
_mouseOffset = p;
}
public function TransformToolCursor() {
addEventListener(TransformTool.CONTROL_INIT, init);
}
/**
* Adds a reference to the list of references that the cursor
* uses to determine when to be displayed. Typically this would
* be a TransformToolControl instance used in the transform tool
* @see removeReference
*/
public function addReference(reference:DisplayObject):void {
if (reference && !references[reference]) {
references[reference] = true ;
addReferenceListeners(reference);
}
}
/**
* Removes a reference to the list of references that the cursor
* uses to determine when to be displayed.
* @see addReference
*/
public function removeReference(reference:DisplayObject):DisplayObject {
if (reference && references[reference]) {
removeReferenceListeners(reference);
delete references[reference];
return reference;
}
return null ;
}
/**
* Called when the cursor should determine
* whether it should be visible or not
*/
public function updateVisible(event:Event = null ):void {
if (active) {
if (!visible) {
visible = true ;
}
} else if (visible ! = contact) {
visible = contact;
}
position(event);
}
/**
* Called when the cursor should position itself
*/
public function position(event:Event = null ):void {
if (parent) {
x = parent.mouseX + mouseOffset.x;
y = parent.mouseY + mouseOffset.y;
}
}
private function init(event:Event):void {
_transformTool.addEventListener(TransformTool.TRANSFORM_TOOL, position, false , 0 , true );
_transformTool.addEventListener(TransformTool.NEW_TARGET, referenceUnset, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_TRANSFORM_TOOL, position, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_DOWN, controlMouseDown, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_MOVE, controlMove, false , 0 , true );
_transformTool.addEventListener(TransformTool.CONTROL_UP, controlMouseUp, false , 0 , true );
updateVisible(event);
position(event);
}
private function addReferenceListeners(reference:DisplayObject):void {
reference.addEventListener(MouseEvent.MOUSE_MOVE, referenceMove, false , 0 , true );
reference.addEventListener(MouseEvent.MOUSE_DOWN, referenceSet, false , 0 , true );
reference.addEventListener(MouseEvent.ROLL_OVER, referenceSet, false , 0 , true );
reference.addEventListener(MouseEvent.ROLL_OUT, referenceUnset, false , 0 , true );
}
private function removeReferenceListeners(reference:DisplayObject):void {
reference.removeEventListener(MouseEvent.MOUSE_MOVE, referenceMove, false );
reference.removeEventListener(MouseEvent.MOUSE_DOWN, referenceSet, false );
reference.removeEventListener(MouseEvent.ROLL_OVER, referenceSet, false );
reference.removeEventListener(MouseEvent.ROLL_OUT, referenceUnset, false );
}
protected function referenceMove(event:MouseEvent):void {
position(event);
event.updateAfterEvent();
}
protected function referenceSet(event:Event):void {
contact = true ;
if (!_transformTool.currentControl) {
updateVisible(event);
}
}
protected function referenceUnset(event:Event):void {
contact = false ;
if (!_transformTool.currentControl) {
updateVisible(event);
}
}
// the following control methods rely on TransformToolControl.relatedObject
// to tell if a reference is being interacted with and therefore active
protected function controlMouseDown(event:Event):void {
if (references[_transformTool.currentControl.relatedObject]) {
active = true ;
// ~ contact = true ;
}
updateVisible(event);
}
protected function controlMove(event:Event):void {
if (references[_transformTool.currentControl.relatedObject]) {
position(event);
}
}
protected function controlMouseUp(event:Event):void {
if (references[_transformTool.currentControl.relatedObject]) {
active = false ;
}
updateVisible(event);
}
}
}