1  
     8   
     9  import com.sekati.core.CoreObject;
    10  import com.sekati.except.IllegalArgumentException;
    11  
    12  
    24  class com.sekati.ui.ContextualMenu extends CoreObject {
    25  
    26  	private var _target:MovieClip;
    27  	private var _isEnabled:Boolean;
    28  	private var _hasBuiltInItems:Boolean;
    29  	private var _items:Array;
    30  	private var _backup:Array;
    31  
    32  		
    38  	public function ContextualMenu(target:MovieClip) {
    39  		if(!target) {
    40  			throw new IllegalArgumentException( this, "Constructor expects a 'target:MovieClip' parameter.", arguments );
    41  			return;	
    42  		}
    43  		_target = target;
    44  		_isEnabled = true;
    45  		_hasBuiltInItems = false;
    46  		_items = new Array( );
    47  		_backup = new Array( );
    48  	}
    49  
    50  		 
    58  	public function addItem(caption:String, cb:Function, isDiv:Boolean, isEnabled:Boolean):Number {
    59  		cb = (!cb) ? menuClick : cb;
    60  		isDiv = (isDiv == undefined) ? true : isDiv;
    61  		isEnabled = (isEnabled == undefined) ? true : isEnabled;
    62  		var id:Number = _items.push( {_caption:caption, _cb:cb, _isDiv:isDiv, _isEnabled:isEnabled} );
    63  		buildMenu( );
    64  		return id;
    65  	}
    66  
    67  	
    76  	public function editItem(oldCaption:String, newCaption:String, cb:Function, isDiv:Boolean, isEnabled:Boolean):Boolean {
    77  		var prevItem:Object, newItem:Object;
    78  		for(var i:Number = 0; i < _items.length ; i++) {
    79  			if (_items[i]._caption === oldCaption) {
    80  				prevItem = _items[i];
    81  				var newCb:Function = (!cb) ? prevItem._cb : cb;
    82  				var newDiv:Boolean = (!isDiv) ? prevItem._isDiv : isDiv;
    83  				var newEnabled:Boolean = (!isEnabled) ? true : false;
    84  				newItem = {_caption:newCaption, _cb:newCb, _isDiv:newDiv, _isEnabled:newEnabled};
    85  				_items[i] = newItem;
    86  				buildMenu( );
    87  				return true;
    88  			}			
    89  		}
    90  		return false;	
    91  	}
    92  
    93  	
    98  	public function enableItem(name:String):Void {
    99  		var i:Number = getItemIndex( "_caption", name );
   100  		if(i == null) return;
   101  		_items[i]._isEnabled = true;
   102  		buildMenu( );		
   103  	}
   104  
   105  	
   110  	public function disableItem(name:String):Void {
   111  		var i:Number = getItemIndex( "_caption", name );
   112  		if(i == null) return;
   113  		_items[i]._isEnabled = false;
   114  		buildMenu( );
   115  	}
   116  
   117  	
   122  	public function removeItem(name:String):Boolean {
   123  		var itemIndex:Number = getItemIndex( "_caption", name );
   124  		if (itemIndex != null) {
   125  			
   126  			_items[itemIndex] = {};
   127  			
   128  			buildMenu( );
   129  			return true;
   130  		}	
   131  		return false;
   132  	}
   133  
   134  	
   140  	private function getItemIndex(prop:String, val:Object):Number {
   141  		for(var i:Number = 0; i < _items.length ; i++) {
   142  			if(_items[i][prop] === val) {
   143  				return i;
   144  			}
   145  		}
   146  		return null;
   147  	}		
   148  
   149  		
   153  	private function buildMenu():Void {
   154  		var m:ContextMenu = new ContextMenu( );
   155  		if (!_hasBuiltInItems) m.hideBuiltInItems( );
   156  		for (var i:Number = 0; i < _items.length ; i++) {
   157  			if (_items[i]._caption) {
   158  				var cmi:ContextMenuItem = new ContextMenuItem( _items[i]._caption, _items[i]._cb, _items[i]._isDiv, _items[i]._isEnabled );
   159  				m.customItems.push( cmi );
   160  			}
   161  		}
   162  		_target.menu = m;
   163  	}
   164  
   165  	
   170  	public function set enabled(b:Boolean):Void {
   171  		if (b == false) {
   172  			if (_isEnabled != false) {
   173  				_isEnabled = false;
   174  				_backup = _items;
   175  				_items = [];
   176  				buildMenu( );
   177  			}
   178  		} else {
   179  			if (_isEnabled != true) {
   180  				_isEnabled = true;
   181  				_items = _backup;
   182  				buildMenu( );
   183  			}
   184  		}
   185  	}
   186  
   187  	
   191  	public function get enabled():Boolean {
   192  		return _isEnabled;	
   193  	}	
   194  
   195  	
   200  	public function set builtInItems(b:Boolean):Void {
   201  		_hasBuiltInItems = b;	
   202  	}
   203  
   204  	
   208  	public function get builtInItems():Boolean {
   209  		return _hasBuiltInItems;	
   210  	}
   211  
   212  	
   216  	public function menuClick():Void {
   217  	}
   218  }