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 }