rsence-pre 2.2.2.1 → 2.3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/VERSION +1 -1
  2. data/conf/default_conf.yaml +6 -1
  3. data/js/comm/queue/queue.js +0 -1
  4. data/js/comm/transporter/transporter.js +32 -16
  5. data/js/comm/values/values.js +45 -13
  6. data/js/controls/sliders/slider/slider.js +5 -6
  7. data/js/controls/sliders/slider/themes/default/slider.css +34 -62
  8. data/js/controls/sliders/slider/themes/default/slider.html +4 -4
  9. data/js/controls/sliders/vslider/themes/default/vslider.css +43 -10
  10. data/js/controls/sliders/vslider/vslider.js +3 -1
  11. data/js/controls/stepper/stepper.js +1 -1
  12. data/js/controls/stringview/stringview.js +6 -8
  13. data/js/controls/stringview/themes/default/stringview.html +1 -1
  14. data/js/controls/textcontrol/textcontrol.js +22 -16
  15. data/js/controls/textcontrol/themes/default/textcontrol.css +23 -22
  16. data/js/controls/window/window.js +1 -1
  17. data/js/core/class/class.js +4 -4
  18. data/js/core/event/event.js +3 -2
  19. data/js/datetime/calendar/calendar.coffee +114 -58
  20. data/js/datetime/calendar/themes/default/calendar.css +4 -2
  21. data/js/foundation/control/control.js +2 -0
  22. data/js/foundation/control/dyncontrol/dyncontrol.js +15 -0
  23. data/js/foundation/control/eventresponder/eventresponder.js +29 -20
  24. data/js/foundation/eventmanager/eventmanager.coffee +1090 -0
  25. data/js/foundation/eventmanager/eventmanager.js +116 -28
  26. data/js/foundation/json_renderer/json_renderer.js +4 -2
  27. data/js/foundation/system/system.js +3 -0
  28. data/js/foundation/view/view.js +6 -30
  29. data/js/lists/listitems/listitems.js +8 -1
  30. data/js/lists/radiobuttonlist/radiobuttonlist.js +9 -4
  31. data/js/menus/minimenu/minimenu.js +11 -5
  32. data/js/menus/minimenuitem/minimenuitem.js +6 -4
  33. data/js/tables/table/table.coffee +19 -0
  34. data/js/tables/table/themes/default/table.css +0 -0
  35. data/js/tables/table/themes/default/table.html +19 -0
  36. data/lib/rsence/argv/initenv_argv.rb +1 -1
  37. data/lib/rsence/http/broker.rb +3 -1
  38. data/lib/rsence/msg.rb +1 -1
  39. data/lib/rsence/plugins/gui_plugin.rb +2 -0
  40. data/lib/rsence/sessionmanager.rb +7 -7
  41. data/lib/rsence/sessionstorage.rb +3 -1
  42. data/lib/rsence/transporter.rb +56 -32
  43. data/lib/rsence/valuemanager.rb +3 -3
  44. data/plugins/client_pkg/client_pkg.rb +5 -0
  45. data/plugins/client_pkg/lib/client_pkg_build.rb +29 -4
  46. metadata +10 -7
@@ -359,7 +359,7 @@ HWindow = HDynControl.extend({
359
359
  _fitsRect.setHeight( this.options.minSize[1] );
360
360
  }
361
361
  // doesn't fit or right-clicked or alt-clicked, maximize:
362
- if (!_fitsRect.equals(_maxRect) && (EVENT.status[ EVENT.button2 ] || EVENT.status[ EVENT.altKeyDown ]) ){
362
+ if (!_fitsRect.equals(_maxRect) && (EVENT.status.button2 || EVENT.status.altKeyDown) ){
363
363
  // console.log('force-max');
364
364
  this.animateTo( _maxRect );
365
365
  this.prevRect = HRect.nu( this.rect );
@@ -139,7 +139,7 @@ HClass.prototype = {
139
139
  return this;
140
140
  },
141
141
  /** = Description
142
- * If a method has been overridden then the base method provides access to the overridden method.
142
+ * If a method has been overridden then the base method provides access to the overridden method.
143
143
  * Call this method from any other method to invoke that method's ancestor.
144
144
  * It is also possible to call the base method from within a constructor function.
145
145
  *
@@ -205,7 +205,7 @@ HClass.extend = function(_instance, _static) {
205
205
  HClass._prototyping = true;
206
206
  // this is base for single instance or prototype (class structure) for object that are created
207
207
  // from this class
208
- _prototype = new this;
208
+ _prototype = new this();
209
209
  // copies properties and methods from _instance to _prototype (class structure)
210
210
  _extend.call(_prototype, _instance);
211
211
  // this constructor came from _instance
@@ -329,8 +329,8 @@ try {
329
329
  // console.log surrogate for browsers without a console
330
330
  if(window['console']===undefined){
331
331
  window.console = {
332
- log: function(){
333
- }
332
+ log: function(){},
333
+ warn: function(){}
334
334
  };
335
335
  }
336
336
 
@@ -65,11 +65,11 @@ Event = {
65
65
  if (!Event.observers) {
66
66
  Event.observers = [];
67
67
  }
68
- if (_elem.addEventListener) {
68
+ if (_elem && _elem.addEventListener) {
69
69
  this.observers.push([_elem, _name, _function, _useCapture]);
70
70
  _elem.addEventListener(_name, _function, _useCapture);
71
71
  }
72
- else if (_elem.attachEvent) {
72
+ else if (_elem && _elem.attachEvent) {
73
73
  this.observers.push([_elem, _name, _function, _useCapture]);
74
74
  _elem.attachEvent("on" + _name, _function);
75
75
  }
@@ -98,6 +98,7 @@ Event = {
98
98
  observe: function(_elem, _name, _function, _useCapture) {
99
99
  _useCapture = _useCapture || false;
100
100
  Event._observeAndCache(_elem, _name, _function, _useCapture);
101
+ return _function;
101
102
  },
102
103
 
103
104
  /** Stops observing the named event of the element and
@@ -20,7 +20,7 @@ HCalendar = HControl.extend
20
20
  ## the mouse wheel or equivalent content-scrolling user interface gesture
21
21
  defaultEvents:
22
22
  mouseWheel: true
23
- # click: true
23
+ keyDown: true
24
24
 
25
25
  ## Calls HCalendar#nextMonth or HCalendar#prevMonth based on delta change
26
26
  ## of the mouseWheel event
@@ -29,10 +29,65 @@ HCalendar = HControl.extend
29
29
  @nextMonth()
30
30
  else
31
31
  @prevMonth()
32
+
33
+ ## Draws the next month
34
+ nextMonth: (_set)->
35
+ _dateNext = new Date( @viewMonth[0], @viewMonth[1]+1, 1 )
36
+ _dateMs = _dateNext.getTime() - @tzMs(_dateNext)
37
+ if _set
38
+ @setValue( _dateMs/1000 )
39
+ else
40
+ @drawCalendar( new Date(_dateMs) )
41
+
42
+ ## Draws the prev month
43
+ prevMonth: (_set)->
44
+ _datePrev = new Date( @viewMonth[0], @viewMonth[1]-1, 1 )
45
+ _dateMs = _datePrev.getTime() - @tzMs(_datePrev)
46
+ if _set
47
+ @setValue( _dateMs/1000 )
48
+ else
49
+ @drawCalendar( new Date(_dateMs) )
32
50
 
33
- ## Simple click-through for the themed hyperlinks
34
- click: ->
35
- false
51
+ ## Draws the next year
52
+ nextYear: (_set)->
53
+ _dateNext = new Date( @viewMonth[0]+1, @viewMonth[1], 1 )
54
+ _dateMs = _dateNext.getTime() - @tzMs(_dateNext)
55
+ if _set
56
+ @setValue( _dateMs/1000 )
57
+ else
58
+ @drawCalendar( new Date(_dateMs) )
59
+
60
+ ## Draws the prev year
61
+ prevYear: (_set)->
62
+ _datePrev = new Date( @viewMonth[0]-1, @viewMonth[1], 1 )
63
+ _dateMs = _datePrev.getTime() - @tzMs(_datePrev)
64
+ if _set
65
+ @setValue( _dateMs/1000 )
66
+ else
67
+ @drawCalendar( new Date(_dateMs) )
68
+
69
+ nextDay: -> @setValue( @value + 24*60*60 )
70
+ prevDay: -> @setValue( @value - 24*60*60 )
71
+ nextWeek: -> @setValue( @value + 7*24*60*60 )
72
+ prevWeek: -> @setValue( @value - 7*24*60*60 )
73
+
74
+ ## Keyboard control
75
+ keyDown: (_key)->
76
+ if EVENT.status.shiftKeyDown
77
+ @prevMonth(true) if _key == Event.KEY_LEFT
78
+ @nextMonth(true) if _key == Event.KEY_RIGHT
79
+ @prevYear(true) if _key == Event.KEY_UP
80
+ @nextYear(true) if _key == Event.KEY_DOWN
81
+ else
82
+ @nextDay() if _key == Event.KEY_RIGHT
83
+ @prevDay() if _key == Event.KEY_LEFT
84
+ @nextWeek() if _key == Event.KEY_DOWN
85
+ @prevWeek() if _key == Event.KEY_UP
86
+ @prevMonth(true) if _key == Event.KEY_PAGEUP
87
+ @nextMonth(true) if _key == Event.KEY_PAGEDOWN
88
+ @prevYear(true) if _key == Event.KEY_HOME
89
+ @nextYear(true) if _key == Event.KEY_END
90
+ true
36
91
 
37
92
  drawSubviews: ->
38
93
  _this = @
@@ -128,91 +183,83 @@ HCalendar = HControl.extend
128
183
  }
129
184
  }
130
185
 
186
+ lostActiveStatus: (_obj)->
187
+ if (_obj and @menu and !@menu._killed and !_obj.isChildOf(@menu) and !_obj.isChildOf(@menu.menuItemView))
188
+ @menu.die()
189
+ @base(_obj)
190
+
131
191
  ## Calls #drawCalendar when the value is changed
132
192
  refreshValue: ->
133
193
  @drawCalendar( @date() )
134
194
 
135
- ## Draws the next month
136
- nextMonth: ->
137
- _dateNext = new Date( @viewMonth[0], @viewMonth[1]+1, 1 )
138
- _dateMs = _dateNext.getTime() - @tzMs(_dateNext)
139
- @drawCalendar( new Date(_dateMs) )
140
-
141
- ## Drows the prev month
142
- prevMonth: ->
143
- _datePrev = new Date( @viewMonth[0], @viewMonth[1]-1, 1 )
144
- _dateMs = _datePrev.getTime() - @tzMs(_datePrev)
145
- @drawCalendar( new Date(_dateMs) )
146
-
147
195
  ## Stores the currently viewed year and month
148
196
  viewMonth: [ 1970, 0 ]
149
197
 
150
198
  ## Shows a pulldown menu for month selection
151
199
  monthMenu: ->
152
200
  return unless HMiniMenu?
153
- _calendar = this
201
+ _calendar = @
154
202
  _monthValues = []
155
203
  for _monthName, i in HLocale.dateTime.strings.monthsLong
156
204
  _monthValues.push( [ i, _monthName ] )
157
205
  _rect = ELEM.getBoxCoords( @_monthMenu )
158
206
  _rect[0] += 20
159
207
  _rect[2] = 80 if _rect[2] < 80
160
- HMiniMenu.extend(
161
- _killAfterRefresh: false
208
+ @menu = HMiniMenu.extend(
209
+ click: ->
210
+ console.log('click')
162
211
  menuHide: ->
212
+ return if @_killed?
213
+ @_killed = true
163
214
  @base()
215
+ _calendar.setValue( _calendar.setMonth( @value ) )
216
+ if _calendar.month() != @value
217
+ _calendar.setValue( _calendar.setMday( 30 ) )
218
+ _calendar.setValue( _calendar.setMonth( @value ) )
219
+ if _calendar.month() != @value
220
+ _calendar.setValue( _calendar.setMday( 29 ) )
221
+ _calendar.setValue( _calendar.setMonth( @value ) )
222
+ if _calendar.month() != @value
223
+ _calendar.setValue( _calendar.setMday( 28 ) )
224
+ _calendar.setValue( _calendar.setMonth( @value ) )
164
225
  _menu = @
165
- _menu._killAfterRefresh = true
166
226
  COMM.Queue.push( ->
167
- if _menu._killAfterRefresh
168
- _menu.refreshValue()
227
+ EVENT.changeActiveControl(_calendar)
228
+ _calendar.menu = null
229
+ _menu.die()
169
230
  )
170
- return true;
171
- refreshValue: ->
172
- @base()
173
- if @_killAfterRefresh
174
- @_killAfterRefresh = false
175
- _calendar.setValue( _calendar.setMonth( @value ) )
176
- if _calendar.month() != @value
177
- _calendar.setValue( _calendar.setMday( 30 ) )
178
- _calendar.setValue( _calendar.setMonth( this.value ) )
179
- if _calendar.month() != @value
180
- _calendar.setValue( _calendar.setMday( 29 ) )
181
- _calendar.setValue( _calendar.setMonth( @value ) )
182
- if _calendar.month() != this.value
183
- _calendar.setValue( _calendar.setMday( 28 ) )
184
- _calendar.setValue( _calendar.setMonth( @value ) )
185
- _menu = this
186
- COMM.Queue.push( ->
187
- _menu.die()
188
- )
189
231
  ).new( _rect, @,
190
232
  value: @month()
191
233
  initialVisibility: true
192
- ).setListItems( _monthValues )
234
+ listItems: _monthValues
235
+ )
193
236
 
194
237
  ## Shows a text field for year selection
195
238
  yearMenu: ->
196
239
  _calendar = @
240
+ _calendarEnable = @enabled
197
241
  _rect = ELEM.getBoxCoords( @_yearMenu )
198
242
  _rect[0] += 20
199
243
  _rect[2] = 40 if _rect[2] < 40
200
- _rect[3] = 20
244
+ _rect[3] = 16
245
+ EVENT.changeActiveControl(null)
246
+ @setEnabled(false)
201
247
  HNumericTextControl.extend(
202
248
  refreshValue: ->
203
249
  @base()
204
250
  _calendar.setValue( _calendar.setYear( @value ) )
251
+ gainedActiveStatus: (_obj)->
252
+ @base(_obj)
253
+ _calendar.setEnabled(_calendarEnable)
205
254
  textBlur: ->
206
255
  @base()
207
- _year = this
256
+ _year = @
208
257
  COMM.Queue.push( ->
209
- _year.die() if _year.markupElemIds?
258
+ if _year.markupElemIds?
259
+ _year.die()
210
260
  )
211
- textEnter: ->
212
- @base()
213
- _returnKeyPressed = EVENT.status[ EVENT.keysDown ].indexOf( 13 ) != -1
214
- _noKeysPressed = EVENT.status[ EVENT.keysDown ].length == 0
215
- if _returnKeyPressed or _noKeysPressed
261
+ keyDown: (_key)->
262
+ if _key == Event.KEY_RETURN
216
263
  ELEM.get( @markupElemIds.value ).blur()
217
264
  ).new( _rect, @,
218
265
  value: @year()
@@ -220,6 +267,11 @@ HCalendar = HControl.extend
220
267
  maxValue: 38400
221
268
  focusOnCreate: true
222
269
  refreshOnInput: false
270
+ refreshOnIdle: false
271
+ events:
272
+ keyDown: true
273
+ style:
274
+ fontSize: '11px'
223
275
  )
224
276
 
225
277
  _destroyCalendarElems: ->
@@ -238,7 +290,6 @@ HCalendar = HControl.extend
238
290
  ## Params:
239
291
  ## - _date: The date on which calendar UI is opened at.
240
292
  drawCalendar: (_date)->
241
- @_destroyCalendarElems()
242
293
  _date = @date() unless ( _date instanceof Date )
243
294
  _calendarDateRange = @calendarDateRange( _date )
244
295
  _monthFirst = _calendarDateRange.month.firstDate
@@ -252,7 +303,7 @@ HCalendar = HControl.extend
252
303
  _colWidth = Math.floor( _availWidth / 8 )
253
304
  _rowHeight = Math.floor( _availHeight / 6 )
254
305
  _parentElem = @markupElemIds.value
255
- ELEM.setStyle( _parentElem, 'visibility', 'hidden', true )
306
+ # ELEM.setStyle( _parentElem, 'visibility', 'hidden', true )
256
307
  _elems = []
257
308
  _this = @
258
309
  for _row in [0..5]
@@ -288,9 +339,10 @@ HCalendar = HControl.extend
288
339
  else
289
340
  ELEM.addClassName( _colElem, 'calendar_weeks_week_col_yes' )
290
341
  ELEM.setAttr( _colElem, '_colSecs', _colSecs )
291
- Event.observe( ELEM.get( _colElem ), 'click', ->
292
- _this.setValue( @_colSecs )
293
- )
342
+ if @enabled
343
+ Event.observe( ELEM.get( _colElem ), 'click', ->
344
+ _this.setValue( @_colSecs )
345
+ )
294
346
  # ELEM.setAttr( _colElem, 'href', "javascript:HSystem.views[#{@viewId}].setValue(#{_colSecs})" )
295
347
  _left = (_col*_colWidth+_leftPlus)
296
348
  ELEM.setStyle( _colElem, 'left', _left+'px' )
@@ -298,13 +350,15 @@ HCalendar = HControl.extend
298
350
  ELEM.setStyle( _colElem, 'height', (_rowHeight-1)+'px' )
299
351
  ELEM.setStyle( _colElem, 'line-height', _rowHeight+'px' )
300
352
  ELEM.setHTML( _colElem, @mday( _colDate ) )
301
- ELEM.setStyle( _parentElem, 'visibility', 'inherit' )
353
+ # ELEM.setStyle( _parentElem, 'visibility', 'inherit' )
354
+ ELEM.flush()
302
355
  _stateElem = @markupElemIds.state
303
356
 
304
357
  @_monthMenu = ELEM.make( _stateElem, 'span' )#, 'a' )
305
358
  _elems.push( @_monthMenu )
306
359
  # ELEM.setAttr( @_monthMenu, 'href', "javascript:HSystem.views[#{@viewId}].monthMenu()" )
307
- Event.observe( ELEM.get( @_monthMenu ), 'click', ( -> _this.monthMenu() ), false )
360
+ if @enabled
361
+ Event.observe( ELEM.get( @_monthMenu ), 'click', ( -> _this.monthMenu() ), false )
308
362
  ELEM.setHTML( @_monthMenu, @monthName( _date ) )
309
363
 
310
364
  _spacer = ELEM.make( _stateElem, 'span' )
@@ -313,11 +367,13 @@ HCalendar = HControl.extend
313
367
 
314
368
  @_yearMenu = ELEM.make( _stateElem, 'span' )#, 'a' )
315
369
  _elems.push( @_yearMenu )
316
- Event.observe( ELEM.get( @_yearMenu ), 'click', ( -> _this.yearMenu() ), false )
370
+ if @enabled
371
+ Event.observe( ELEM.get( @_yearMenu ), 'click', ( -> _this.yearMenu() ), false )
317
372
  # ELEM.setAttr( @_yearMenu, 'href', "javascript:HSystem.views[#{@viewId}].yearMenu()" )
318
373
  ELEM.setHTML( @_yearMenu, @year( _date ) )
319
374
 
320
375
  @viewMonth = [ _monthFirst.getUTCFullYear(), _monthFirst.getUTCMonth() ]
376
+ @_destroyCalendarElems()
321
377
  @_drawCalendarElems = _elems
322
378
 
323
379
  HCalendar.implement( HDateTime )
@@ -95,10 +95,12 @@
95
95
  font-weight: bold;
96
96
  border: 1px solid #666;
97
97
  }
98
- .calendar_weeks_week_col_sel,
99
- .calendar_weeks_week_col_yes:hover {
98
+ .calendar_weeks_week_col_sel {
100
99
  background-color: #fff;
101
100
  }
101
+ .calendar_weeks_week_col_yes:hover {
102
+ border: 2px solid black; margin: -1px; z-index: 100; border-radius: 3px;
103
+ }
102
104
  .calendar_bg {
103
105
  position: absolute;
104
106
  left: -1px; right: -1px;
@@ -16,6 +16,8 @@
16
16
  **/
17
17
  var//RSence.Foundation
18
18
  HControl = HView.extend({
19
+
20
+ isCtrl: true,
19
21
 
20
22
  /** A flag: when true, calls the +refreshValue+ method whenever
21
23
  * +self.value+ is changed.
@@ -441,6 +441,11 @@ HDynControl = HControl.extend({
441
441
  x-=_parent.pageX();
442
442
  y-=_parent.pageY();
443
443
  }
444
+ else {
445
+ var _scrollPos = ELEM.getScrollPosition(0);
446
+ x+=_scrollPos[0];
447
+ y+=_scrollPos[1];
448
+ }
444
449
  this._startPoint = new HPoint(x,y);
445
450
  this._startRect = new HRect( this.rect );
446
451
  this._detectActionFlag();
@@ -473,6 +478,11 @@ HDynControl = HControl.extend({
473
478
  x-=_parent.pageX();
474
479
  y-=_parent.pageY();
475
480
  }
481
+ else {
482
+ var _scrollPos = ELEM.getScrollPosition(0);
483
+ x+=_scrollPos[0];
484
+ y+=_scrollPos[1];
485
+ }
476
486
  if(this._actionFlag!==-1){
477
487
  this._actionFns[this._actionFlag](this,x,y);
478
488
  }
@@ -503,6 +513,11 @@ HDynControl = HControl.extend({
503
513
  x-=_parent.pageX();
504
514
  y-=_parent.pageY();
505
515
  }
516
+ else {
517
+ var _scrollPos = ELEM.getScrollPosition(0);
518
+ x+=_scrollPos[0];
519
+ y+=_scrollPos[1];
520
+ }
506
521
  if(this._actionFlag!==-1){
507
522
  this._actionFns[this._actionFlag](this,x,y);
508
523
  }
@@ -28,6 +28,8 @@
28
28
  ** on the droppable.
29
29
  ** +startHover+:: Called when a draggable item is moved
30
30
  ** over the droppable.
31
+ ** +hover+:: Called while a dragged item is moved between
32
+ ** startHover and endHover.
31
33
  ** +endHover+:: Called when a draggable item is moved out
32
34
  ** of the droppable.
33
35
  ** +keyDown+:: Called when the user presses a key, and
@@ -154,10 +156,11 @@ HEventResponder = HClass.extend({
154
156
  click: false,
155
157
  resize: false,
156
158
  doubleClick: false,
157
- contextMenu: false
159
+ contextMenu: false,
160
+ rectHover: false,
161
+ multiDrop: false
158
162
  } ).extend( this.defaultEvents ).extend( _events?_events:{} ).nu();
159
163
  }
160
- this.events.ctrl = this;
161
164
  EVENT.reg( this, this.events );
162
165
  return this;
163
166
  },
@@ -487,7 +490,7 @@ HEventResponder = HClass.extend({
487
490
  if(this.enabled) {
488
491
  this.toggleCSSClass(this.elemId, HControl.CSS_ACTIVE, true);
489
492
  }
490
- this.gainedActiveStatus(_lastActiveControl);
493
+ return this.gainedActiveStatus(_lastActiveControl);
491
494
  },
492
495
 
493
496
 
@@ -644,7 +647,6 @@ HEventResponder = HClass.extend({
644
647
  *
645
648
  **/
646
649
  endDrag: function(x, y) {
647
- this.invalidatePositionCache();
648
650
  },
649
651
 
650
652
  /** = Description
@@ -678,6 +680,10 @@ HEventResponder = HClass.extend({
678
680
  },
679
681
  onHoverStart: function(obj) {},
680
682
 
683
+ hover: function(obj){
684
+
685
+ },
686
+
681
687
  /** = Description
682
688
  * Default endHover event responder method. Does nothing by default.
683
689
  * Extend the endHover method, if you want to do something
@@ -763,21 +769,24 @@ HEventResponder = HClass.extend({
763
769
  EVENT.blur(_this);
764
770
  Event.stop(e);
765
771
  },
766
-
767
-
768
- /** = Description
769
- * Forces retrieving this control's DOM element position directly rather than
770
- * using the cached version when the position is needed by +EVENT+.
771
- * Child controls are invalidated recursively by +HView+.
772
- *
773
- * = Returns
774
- * +self+
775
- *
772
+
773
+ /** Selection handling; currently under construction
776
774
  **/
777
- invalidatePositionCache: function() {
778
- this.base();
779
- EVENT.coordCacheFlush(this.elemId);
780
- return this;
781
- }
782
-
775
+ selected: false,
776
+ select: function(){
777
+ this.selected = true;
778
+ console.warn("HControl#select not supported yet.");
779
+ },
780
+ deSelect: function(){
781
+ this.selected = false;
782
+ console.warn("HControl#deSelect not supported yet.");
783
+ },
784
+ setSelected: function(_state){
785
+ if( _state ){
786
+ this.select();
787
+ }
788
+ else {
789
+ this.deSelect();
790
+ }
791
+ }
783
792
  });