TransformToolCursor.as

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);
        }
    }
}

转载于:https://www.cnblogs.com/ddw1997/archive/2009/10/09/1579922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值