r20517: re-add cleaned-up webapps
[kai/samba.git] / webapps / qooxdoo-0.6.3-sdk / frontend / framework / source / class / qx / manager / selection / RadioManager.js
1 /* ************************************************************************
2
3    qooxdoo - the new era of web development
4
5    http://qooxdoo.org
6
7    Copyright:
8      2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
9
10    License:
11      LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
12
13    Authors:
14      * Sebastian Werner (wpbasti)
15      * Andreas Ecker (ecker)
16
17 ************************************************************************ */
18
19 /* ************************************************************************
20
21 #module(ui_form)
22
23 ************************************************************************ */
24
25 /*!
26   Each instance manage vItems set of radio options: qx.ui.form.RadioButton, qx.ui.toolbar.RadioButton, ...
27 */
28 qx.OO.defineClass("qx.manager.selection.RadioManager", qx.core.Target,
29 function(vName, vMembers)
30 {
31   // we don't need the manager data structures
32   qx.core.Target.call(this);
33
34   // create item array
35   this._items = [];
36
37   // apply name property
38   this.setName(qx.util.Validation.isValidString(vName) ? vName : qx.manager.selection.RadioManager.AUTO_NAME_PREFIX + this._hashCode);
39
40   if (qx.util.Validation.isValidArray(vMembers)) {
41     // add() iterates over arguments, but vMembers is an array
42     this.add.apply(this, vMembers);
43   }
44 });
45
46 qx.manager.selection.RadioManager.AUTO_NAME_PREFIX = "qx-radio-";
47
48
49
50
51 /*
52 ---------------------------------------------------------------------------
53   PROPERTIES
54 ---------------------------------------------------------------------------
55 */
56
57 qx.OO.addProperty({ name : "selected" });
58 qx.OO.addProperty({ name : "name", type : "string" });
59
60
61
62
63
64
65 /*
66 ---------------------------------------------------------------------------
67   UTILITIES
68 ---------------------------------------------------------------------------
69 */
70
71 qx.Proto.getItems = function() {
72   return this._items;
73 }
74
75 qx.Proto.handleItemChecked = function(vItem, vChecked)
76 {
77   if (vChecked)
78   {
79     this.setSelected(vItem);
80   }
81   else if (this.getSelected() == vItem)
82   {
83     this.setSelected(null);
84   }
85 }
86
87
88
89
90
91
92
93 /*
94 ---------------------------------------------------------------------------
95   REGISTRY
96 ---------------------------------------------------------------------------
97 */
98
99 qx.Proto.add = function(varargs)
100 {
101   var vItems = arguments;
102   var vLength = vItems.length;
103
104   var vLast = vItems[vLength-1];
105
106   if (!(vLast instanceof qx.ui.core.Parent) && !(vLast instanceof qx.ui.basic.Terminator)) {
107     vLength--;
108   }
109
110   var vItem;
111   for (var i=0; i<vLength; i++)
112   {
113     vItem = vItems[i];
114
115     if(qx.lang.Array.contains(this._items, vItem)) {
116       return;
117     }
118
119     // Push RadioButton to array
120     this._items.push(vItem);
121
122     // Inform radio button about new manager
123     vItem.setManager(this);
124
125     // Need to update internal value?
126     if(vItem.getChecked()) {
127       this.setSelected(vItem);
128     }
129
130     // Make enabled the same status as the the manager has
131     vItem.setEnabled(this.getEnabled());
132
133     // Apply Make name the same
134     vItem.setName(this.getName());
135   }
136 }
137
138 qx.Proto.remove = function(vItem)
139 {
140   // Remove RadioButton from array
141   qx.lang.Array.remove(this._items, vItem);
142
143   // Inform radio button about new manager
144   vItem.setManager(null);
145
146   // if the radio was checked, set internal selection to null
147   if(vItem.getChecked()) {
148     this.setSelected(null);
149   }
150 }
151
152
153
154
155
156
157 /*
158 ---------------------------------------------------------------------------
159   MODIFIER
160 ---------------------------------------------------------------------------
161 */
162
163 qx.Proto._modifySelected = function(propValue, propOldValue, propData)
164 {
165   if (propOldValue && propOldValue.getChecked()) {
166     propOldValue.setChecked(false);
167   }
168
169   if (propValue && !propValue.getChecked()) {
170     propValue.setChecked(true);
171   }
172
173   return true;
174 }
175
176 qx.Proto._modifyEnabled = function(propValue, propOldValue, propData)
177 {
178   for (var i=0, vItems=this._items, vLength=vItems.length; i<vLength; i++) {
179     vItems[i].setEnabled(propValue);
180   }
181
182   return true;
183 }
184
185 qx.Proto._modifyName = function(propValue, propOldValue, propData)
186 {
187   for (var i=0, vItems=this._items, vLength=vItems.length; i<vLength; i++) {
188     vItems[i].setName(propValue);
189   }
190
191   return true;
192 }
193
194
195
196
197
198
199
200 /*
201 ---------------------------------------------------------------------------
202   SELECTION
203 ---------------------------------------------------------------------------
204 */
205
206 qx.Proto.selectNext = function(vItem)
207 {
208   var vIndex = this._items.indexOf(vItem);
209
210   if(vIndex == -1) {
211     return;
212   }
213
214   var i = 0;
215   var vLength = this._items.length;
216
217   // Find next enabled item
218   vIndex = (vIndex + 1) % vLength;
219   while(i < vLength && !this._items[vIndex].getEnabled())
220   {
221     vIndex = (vIndex + 1) % vLength;
222     i++;
223   }
224
225   this._selectByIndex(vIndex);
226 }
227
228 qx.Proto.selectPrevious = function(vItem)
229 {
230   var vIndex = this._items.indexOf(vItem);
231
232   if(vIndex == -1) {
233     return;
234   }
235
236   var i = 0;
237   var vLength = this._items.length;
238
239   // Find previous enabled item
240   vIndex = (vIndex - 1 + vLength) % vLength;
241   while(i < vLength && !this._items[vIndex].getEnabled())
242   {
243     vIndex = (vIndex - 1 + vLength) % vLength;
244     i++;
245   }
246
247   this._selectByIndex(vIndex);
248 }
249
250 qx.Proto._selectByIndex = function(vIndex)
251 {
252   if(this._items[vIndex].getEnabled())
253   {
254     this.setSelected(this._items[vIndex]);
255     this._items[vIndex].setFocused(true);
256   }
257 }
258
259
260
261
262
263
264
265 /*
266 ---------------------------------------------------------------------------
267   DISPOSER
268 ---------------------------------------------------------------------------
269 */
270
271 qx.Proto.dispose = function()
272 {
273   if (this.getDisposed()) {
274     return;
275   }
276
277   this.forceSelected(null);
278
279   if (this._items)
280   {
281     for (var i, vItems=this._items, vLength=vItems.length; i<vLength; i++)
282     {
283       vItems[i].dispose();
284       delete vItems[i];
285     }
286
287     vItems=null;
288     delete this._items;
289   }
290
291   return qx.core.Target.prototype.dispose.call(this);
292 }