1  /*
     2   Copyright aswing.org, see the LICENCE.txt.
     3  */
     4   
     5  import org.aswing.*;
     6   
     7  /**
     8   * 
     9   * @author iiley
    10   */
    11  class org.aswing.DefaultBoundedRangeModel extends EventDispatcher implements BoundedRangeModel{
    12  
    13  	private var value:Number;
    14  	private var extent:Number;
    15  	private var min:Number;
    16  	private var max:Number;
    17  	private var isAdjusting:Boolean;
    18  	
    19  	/**
    20  	 * @throws Error when invalid range properties
    21  	 */
    22  	public function DefaultBoundedRangeModel(value:Number, extent:Number, min:Number, max:Number){
    23  		if(value == undefined) value = 0;
    24  		if(extent == undefined) value = 0;
    25  		if(min == undefined) min = 0;
    26  		if(max == undefined) max = 100;
    27  		
    28  		this.isAdjusting = false;
    29  		
    30  		if (max >= min && value >= min && value + extent >= value && value + extent <= max){
    31  			this.value = value;
    32  			this.extent = extent;
    33  			this.min = min;
    34  			this.max = max;
    35  		}else{
    36  			trace("invalid range properties when construct ort.aswing.DefaultBoundedRangeModel");
    37  			throw new Error("invalid range properties");
    38  		}
    39  	}
    40  	
    41  	public function getValue():Number{
    42  		return value;
    43  	}
    44  	
    45  	public function getExtent():Number{
    46  		return extent;
    47  	}
    48  	
    49  	public function getMinimum():Number{
    50  		return min;
    51  	}
    52  	
    53  	public function getMaximum():Number{
    54  		return max;
    55  	}
    56  	
    57  	public function setValue(n:Number):Void{
    58  		n = Math.min(n, max - extent);
    59  		var newValue:Number = Math.max(n, min);
    60  		setRangeProperties(newValue, extent, min, max, isAdjusting);
    61  	}
    62  	
    63  	public function setExtent(n:Number):Void{
    64  		var newExtent:Number = Math.max(0, n);
    65  		if (value + newExtent > max){
    66  			newExtent = max - value;
    67  		}
    68  		setRangeProperties(value, newExtent, min, max, isAdjusting);
    69  	}
    70  	
    71  	public function setMinimum(n:Number):Void{
    72  		var newMax:Number = Math.max(n, max);
    73  		var newValue:Number = Math.max(n, value);
    74  		var newExtent:Number = Math.min(newMax - newValue, extent);
    75  		setRangeProperties(newValue, newExtent, n, newMax, isAdjusting);
    76  	}
    77  	
    78  	public function setMaximum(n:Number):Void{
    79  		var newMin:Number = Math.min(n, min);
    80  		var newExtent:Number = Math.min(n - newMin, extent);
    81  		var newValue:Number = Math.min(n - newExtent, value);
    82  		setRangeProperties(newValue, newExtent, newMin, n, isAdjusting);
    83  	}
    84  	
    85  	public function setValueIsAdjusting(b:Boolean):Void{
    86  		setRangeProperties(value, extent, min, max, b);
    87  	}
    88  	
    89  	public function getValueIsAdjusting():Boolean{
    90  		return isAdjusting;
    91  	}
    92  	
    93  	public function setRangeProperties(newValue:Number, newExtent:Number, newMin:Number, newMax:Number, adjusting:Boolean):Void{
    94  		if (newMin > newMax){
    95  			newMin = newMax;
    96  		}
    97  		if (newValue > newMax){
    98  			newMax = newValue;
    99  		}
   100  		if (newValue < newMin){
   101  			newMin = newValue;
   102  		}
   103  		if (newExtent + newValue > newMax){
   104  			newExtent = newMax - newValue;
   105  		}
   106  		if (newExtent < 0){
   107  			newExtent = 0;
   108  		}
   109  		var isChange:Boolean = newValue != value || newExtent != extent || newMin != min || newMax != max || adjusting != isAdjusting;
   110  		if (isChange){
   111  			value = newValue;
   112  			extent = newExtent;
   113  			min = newMin;
   114  			max = newMax;
   115  			isAdjusting = adjusting;
   116  			fireStateChanged();
   117  		}
   118  	}
   119  	
   120  	public function addChangeListener(func:Function, obj:Object):Object{
   121  		return addEventListener(Component.ON_STATE_CHANGED, func, obj);
   122  	}
   123  	
   124  	public function fireStateChanged():Void{
   125  		dispatchEvent(Component.ON_STATE_CHANGED, createEventObj(Component.ON_STATE_CHANGED));
   126  	}	
   127  	
   128  	public function toString():String{
   129  		var modelString:String = "value=" + getValue() + ", " + "extent=" + getExtent() + ", " + "min=" + getMinimum() + ", " + "max=" + getMaximum() + ", " + "adj=" + getValueIsAdjusting();
   130  		return "org.aswing.DefaultBoundedRangeModel" + "[" + modelString + "]";
   131  	}	
   132  }
   133