rsence-pre 3.0.0.8 → 3.0.0.9

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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/client/conf/client_pkg.yaml +6 -2
  4. data/client/js/comm/queue/queue.js +32 -44
  5. data/client/js/comm/transporter/transporter.js +24 -16
  6. data/client/js/comm/values/values.js +27 -15
  7. data/client/js/controls/button/button.coffee +14 -5
  8. data/client/js/controls/button/themes/default/button.css +4 -2
  9. data/client/js/controls/checkbox/checkbox.js +4 -4
  10. data/client/js/controls/dialogs/sheet/sheet.js +11 -11
  11. data/client/js/controls/dialogs/sheet/themes/default/sheet.html +1 -1
  12. data/client/js/controls/imageview/imageview.js +15 -15
  13. data/client/js/controls/numerictextcontrol/numerictextcontrol.coffee +32 -10
  14. data/client/js/controls/onoffbutton/onoffbutton.coffee +5 -5
  15. data/client/js/controls/progress/progressbar/progressbar.js +6 -7
  16. data/client/js/controls/progress/progressbar/themes/default/progressbar.css +4 -4
  17. data/client/js/controls/progress/progressbar/themes/default/progressbar.html +1 -2
  18. data/client/js/controls/sliders/slider/slider.js +74 -79
  19. data/client/js/controls/stepper/stepper.js +31 -31
  20. data/client/js/controls/stringview/stringview.js +20 -8
  21. data/client/js/controls/tab/tab.js +57 -63
  22. data/client/js/controls/tab/themes/default/tab.html +4 -1
  23. data/client/js/controls/textcontrol/textcontrol.coffee +13 -3
  24. data/client/js/controls/validatorview/validatorview.js +4 -4
  25. data/client/js/controls/window/window.js +43 -56
  26. data/client/js/core/class/class.js +25 -23
  27. data/client/js/core/elem/elem.coffee +8 -1
  28. data/client/js/core/rsence_ns/rsence_ns.coffee +6 -2
  29. data/client/js/core/util/util_methods/util_methods.coffee +57 -15
  30. data/client/js/datetime/calendar/calendar.coffee +196 -199
  31. data/client/js/datetime/calendar/themes/default/calendar.css +81 -159
  32. data/client/js/datetime/calendar/themes/default/calendar.html +9 -18
  33. data/client/js/datetime/datepicker/datepicker.coffee +18 -3
  34. data/client/js/datetime/datetimepicker/datetimepicker.coffee +6 -1
  35. data/client/js/datetime/datetimevalue/datetimevalue.coffee +194 -0
  36. data/client/js/datetime/momentjs/momentjs.js +310 -76
  37. data/client/js/datetime/timepicker/timepicker.coffee +6 -1
  38. data/client/js/datetime/timesheet/timesheet.js +59 -61
  39. data/client/js/foundation/control/control.js +45 -44
  40. data/client/js/foundation/control/controldefaults/controldefaults.js +13 -9
  41. data/client/js/foundation/control/dyncontrol/dyncontrol.js +45 -57
  42. data/client/js/foundation/control/eventresponder/eventresponder.js +97 -97
  43. data/client/js/foundation/control/valuematrix/valuematrix.js +13 -13
  44. data/client/js/foundation/eventmanager/eventmanager.coffee +50 -32
  45. data/client/js/foundation/geom/rect/rect.js +43 -32
  46. data/client/js/foundation/locale_settings/locale_settings.js +36 -25
  47. data/client/js/foundation/system/system.js +79 -67
  48. data/client/js/foundation/thememanager/thememanager.coffee +11 -1
  49. data/client/js/foundation/value/pullvalue/pullvalue.coffee +7 -0
  50. data/client/js/foundation/value/pushvalue/pushvalue.coffee +25 -0
  51. data/client/js/foundation/value/value.js +22 -15
  52. data/client/js/foundation/view/view.js +94 -55
  53. data/client/js/foundation/view/viewdefaults/viewdefaults.js +5 -1
  54. data/client/js/lists/listitems/listitems.js +26 -4
  55. data/client/js/menus/combobox/combobox.coffee +55 -0
  56. data/client/js/menus/minimenu/minimenu.js +61 -30
  57. data/client/js/menus/minimenu/themes/default/minimenu.css +1 -6
  58. data/client/js/menus/minimenu/themes/default/minimenu.html +5 -4
  59. data/client/js/menus/minimenuitem/minimenuitem.js +6 -6
  60. data/client/js/menus/popupmenu/themes/default/popupmenu.css +1 -6
  61. data/client/js/menus/popupmenu/themes/default/popupmenu.html +5 -4
  62. data/client/js/tables/table/table.coffee +109 -64
  63. data/client/js/tables/table/themes/default/table.css +4 -0
  64. data/lib/rsence/msg.rb +64 -64
  65. data/lib/rsence/plugins/plugin.rb +68 -52
  66. data/lib/rsence/session/sequel_sessionstorage.rb +5 -5
  67. data/lib/rsence/value.rb +79 -59
  68. data/plugins/client_pkg/lib/client_pkg_build.rb +5 -1
  69. data/plugins/client_pkg/lib/client_pkg_serve.rb +40 -32
  70. data/plugins/main/js/main.js +46 -28
  71. metadata +6 -8
  72. data/client/js/datetime/calendar/themes/default/calendar_arrows.png +0 -0
  73. data/client/js/datetime/calendar/themes/default/calendar_bg.png +0 -0
  74. data/client/js/datetime/calendar/themes/default/calendar_parts1.png +0 -0
  75. data/client/js/datetime/calendar/themes/default/calendar_parts2.png +0 -0
  76. data/client/js/datetime/datetimepicker/datetimepicker.js +0 -210
  77. data/client/js/datetime/datetimevalue/datetimevalue.js +0 -265
@@ -26,6 +26,7 @@ HView = UtilMethods.extend({
26
26
 
27
27
  isView: true, // attribute to check if the object is a view
28
28
  isCtrl: false, // attribute to check for if the object is a control
29
+ isDead: false, // attribute to check for killed object references
29
30
 
30
31
  /** Component specific theme path.
31
32
  **/
@@ -294,13 +295,17 @@ HView = UtilMethods.extend({
294
295
  *
295
296
  **/
296
297
  constructor: function(_rect, _parent, _options) {
298
+
299
+ // destructable timeouts:
300
+ this.timeouts = [];
301
+
297
302
  if( !_options ){
298
303
  _options = {};
299
304
  }
300
305
  if(!this.isinherited){
301
306
  _options = (this.viewDefaults.extend(_options)).nu(this);
302
307
  }
303
-
308
+ if( typeof this.customOptions === 'function' ){ this.customOptions( _options ); }
304
309
  this.options = _options;
305
310
  this.label = _options.label;
306
311
 
@@ -317,7 +322,7 @@ HView = UtilMethods.extend({
317
322
  this.preserveTheme = true;
318
323
  }
319
324
 
320
- if(_options.visible === false) {
325
+ if(_options.visible === false || _options.hidden === true) {
321
326
  this.isHidden = true;
322
327
  }
323
328
 
@@ -346,7 +351,7 @@ HView = UtilMethods.extend({
346
351
  // deleted from the element manager when the view gets destroyed.
347
352
  this._domElementBindings = [];
348
353
 
349
- if(!this.isinherited) {
354
+ if(!this.isinherited && this.options.autoDraw) {
350
355
  this.draw();
351
356
  }
352
357
  },
@@ -539,24 +544,6 @@ HView = UtilMethods.extend({
539
544
  ELEM.setAttr( this.elemId, 'elem_id', this.elemId, true );
540
545
  },
541
546
 
542
- /** --
543
- * = Description
544
- * The _setCSS method does the initial styling of the element.
545
- * It's a separate method to ease creating component that require
546
- * other initial styles.
547
- * ++
548
- **/
549
- _setCSS: function(_additional){
550
- var _cssStyle = 'overflow:hidden;visibility:hidden;';
551
- if(this.isAbsolute){
552
- _cssStyle += 'position:absolute;';
553
- } else {
554
- _cssStyle += 'position:relative;';
555
- }
556
- _cssStyle += _additional;
557
- ELEM.setCSS(this.elemId,_cssStyle);
558
- },
559
-
560
547
  /** --
561
548
  * = Description
562
549
  * The _getParentElemId method returns the ELEM ID of the parent.
@@ -607,7 +594,12 @@ HView = UtilMethods.extend({
607
594
  if(!this.elemId) {
608
595
 
609
596
  this._makeElem(this._getParentElemId());
610
- this._setCSS('');
597
+
598
+ ELEM.setStyle(this.elemId,'overflow','hidden',true);
599
+ ELEM.setStyle(this.elemId,'visibility','hidden',true);
600
+
601
+ if(this.isAbsolute){ ELEM.setStyle(this.elemId,'position','absolute'); }
602
+ else { ELEM.setStyle(this.elemId,'position','relative'); }
611
603
 
612
604
  // Theme name == CSS class name
613
605
  if(this.preserveTheme){
@@ -616,6 +608,9 @@ HView = UtilMethods.extend({
616
608
  else {
617
609
  ELEM.addClassName( this.elemId, HThemeManager.currentTheme );
618
610
  }
611
+ if( this.componentName !== undefined ){
612
+ ELEM.addClassName( this.elemId, this.componentName );
613
+ }
619
614
  if( this.options.textSelectable !== undefined ){
620
615
  this.textSelectable = this.options.textSelectable;
621
616
  }
@@ -730,10 +725,10 @@ HView = UtilMethods.extend({
730
725
  ELEM.setStyle( this._ieNoThrough, 'opacity', 0.01 );
731
726
  }
732
727
  if(this.options.style){
733
- this.setStyles( this.options.style );
728
+ this.setStyles( this.options.style ); // optimize
734
729
  }
735
730
  if(this.options.html){
736
- this.setHTML(this.options.html);
731
+ this.setHTML(this.options.html); // optimize
737
732
  }
738
733
  // Extended draw for components to define / extend.
739
734
  // This is preferred over drawSubviews, when defining
@@ -757,6 +752,7 @@ HView = UtilMethods.extend({
757
752
  this.show();
758
753
  }
759
754
  }
755
+ _timeI = 10;
760
756
  this.refresh();
761
757
  return this;
762
758
  },
@@ -813,32 +809,57 @@ HView = UtilMethods.extend({
813
809
  },
814
810
 
815
811
  /** = Description
816
- * Sets or unsets the _cssClass into a DOM element that goes by the ID
817
- * _elementId.
812
+ * Sets or unsets the _className into a DOM element that goes by the ID
813
+ * _elemId.
818
814
  *
819
815
  * = Parameters
820
- * +_elementId+:: ID of the DOM element, or the element itself, to be
816
+ * +_elemId+:: ID of the DOM element, or the element itself, to be
821
817
  * modified.
822
- * +_cssClass+:: Name of the CSS class to be added or removed.
823
- * +_setOn+:: Boolean value that tells should the CSS class be added or
824
- * removed.
818
+ * +_className+:: Name of the CSS class to be added or removed.
819
+ * +_state+:: Boolean value that tells should the CSS class be added or
820
+ * removed. If undefined or null, toggles the current state.
825
821
  *
826
822
  * = Returns
827
823
  * +self+
828
824
  *
829
825
  **/
830
- toggleCSSClass: function(_elementId, _cssClass, _setOn) {
831
- if(_elementId) {
832
- if (_setOn) {
833
- ELEM.addClassName(_elementId, _cssClass);
826
+ toggleCSSClass: function(_elemId, _className, _state) {
827
+ if(_elemId !== null && _elemId !== undefined) {
828
+ // if(_elemId == 920){debugger;}
829
+ if (this.typeChr(_elemId) === 's'){
830
+ _elemId = this.markupElemIds[_elemId];
831
+ }
832
+ if (_state === null || _state === undefined ){
833
+ _state = !ELEM.hasClassName(_elemId,_className);
834
+ }
835
+ if (_state) {
836
+ ELEM.addClassName(_elemId, _className);
834
837
  }
835
838
  else {
836
- ELEM.delClassName(_elementId, _cssClass);
839
+ ELEM.delClassName(_elemId, _className);
837
840
  }
838
841
  }
839
842
  return this;
840
843
  },
841
844
 
845
+ setCSSClass: function( _className, _other ){
846
+ if(_other){
847
+ this.toggleCSSClass( _className, _other, true );
848
+ }
849
+ else{
850
+ this.toggleCSSClass( this.elemId, _className, true );
851
+ }
852
+ },
853
+
854
+ unsetCSSClass: function( _className, _other ){
855
+ if(_other){
856
+ this.toggleCSSClass( _className, _other, false );
857
+ }
858
+ else{
859
+ this.toggleCSSClass( this.elemId, _className, false );
860
+ }
861
+ },
862
+
842
863
  /** = Description
843
864
  * Replaces the contents of the view's DOM element with custom html.
844
865
  *
@@ -918,7 +939,7 @@ HView = UtilMethods.extend({
918
939
  if( this.themeStyle !== undefined && typeof this.themeStyle === 'function' ){
919
940
  this.themeStyle.call(this);
920
941
  }
921
- if(this.optimizeWidthOnRefresh && this.options.pack) {
942
+ if(this.optimizeWidthOnRefresh && this.options.pack && this.drawn) {
922
943
  this.optimizeWidth();
923
944
  }
924
945
  return this;
@@ -1254,7 +1275,12 @@ HView = UtilMethods.extend({
1254
1275
  !this.isProduction && console.log('Warning, setStyleOfPart: partName "'+_partName+'" does not exist for viewId '+this.viewId+'.');
1255
1276
  }
1256
1277
  else {
1257
- ELEM.setStyle(this.markupElemIds[_partName], _name, _value, _force);
1278
+ if( this.typeChr(_name) === 'h'){
1279
+ ELEM.setStyles(this.markupElemIds[_partName], _name );
1280
+ }
1281
+ else{
1282
+ ELEM.setStyle(this.markupElemIds[_partName], _name, _value, _force);
1283
+ }
1258
1284
  }
1259
1285
  return this;
1260
1286
  },
@@ -1508,14 +1534,24 @@ HView = UtilMethods.extend({
1508
1534
  *
1509
1535
  **/
1510
1536
  die: function() {
1537
+ if(this.isDead && !this.isProduction){
1538
+ console.warn('double kill!');
1539
+ return;
1540
+ }
1541
+ this.isDead = true;
1511
1542
  // hide self, makes destruction seem faster
1512
1543
  this.hide();
1513
1544
  this.drawn = false;
1514
1545
  this.stopAnimation();
1546
+ if( this.timeouts ){
1547
+ while( this.timeouts.length ){ clearTimeout(this.timeouts.pop()); }
1548
+ delete this.timeouts;
1549
+ }
1515
1550
  // Delete the children first.
1516
1551
  var _childViewId, i;
1517
- if(!this.views && !this.isProduction){
1552
+ if(!this.views){
1518
1553
  console.log('HView#die: no sub-views for component name: ',this.componentName,', self:',this);
1554
+ return;
1519
1555
  }
1520
1556
  while (this.views && this.views.length !== 0) {
1521
1557
  _childViewId = this.views[0];
@@ -1922,31 +1958,34 @@ HView = UtilMethods.extend({
1922
1958
  * +_elemId+:: Optional, The element ID where the temporary string is created
1923
1959
  * in.
1924
1960
  * +_wrap+:: Optional boolean value, wrap white-space?
1925
- * +_extraCss+:: Optional, extra css to add.
1961
+ * +_customStyle+:: Optional, extra css to add.
1926
1962
  *
1927
1963
  * = Returns
1928
1964
  * The width in pixels required to draw a string in the font.
1929
1965
  *
1930
1966
  **/
1931
- stringSize: function(_string, _length, _elemId, _wrap, _extraCss) {
1967
+ stringSize: function(_string, _length, _elemId, _wrap, _customStyle) {
1968
+ if(!_customStyle){_customStyle = {};}
1969
+ if(this.typeChr(_customStyle) === 's'){
1970
+ console.warn("#stringSize: use styles instead of css text!");
1971
+ _customStyle = {};
1972
+ }
1932
1973
  if (_length || _length === 0) {
1933
1974
  _string = _string.substring(0, _length);
1934
1975
  }
1935
1976
  if (!_elemId && _elemId !== 0) {
1936
- _elemId = 0; //this.elemId;
1937
- }
1938
- if (!_extraCss) {
1939
- _extraCss = '';
1977
+ _elemId = 0;
1940
1978
  }
1979
+ _customStyle.visibility = 'hidden';
1941
1980
  if (!_wrap){
1942
- _extraCss += 'white-space:nowrap;';
1981
+ _customStyle.whiteSpace = 'nowrap';
1943
1982
  }
1944
1983
  var
1945
1984
  _stringParent = ELEM.make(_elemId,'div'),
1946
1985
  _stringElem = ELEM.make(_stringParent,'span');
1947
- ELEM.setCSS(_stringElem, "visibility:hidden;"+_extraCss);
1986
+ ELEM.setStyles(_stringElem, _customStyle);
1948
1987
  ELEM.setHTML(_stringElem, _string);
1949
- ELEM.flushLoop();
1988
+ ELEM.flushElem([_stringParent,_stringElem]);
1950
1989
  var _visibleSize=ELEM.getSize(_stringElem);
1951
1990
  ELEM.del(_stringElem); ELEM.del(_stringParent);
1952
1991
  return [_visibleSize[0]+_visibleSize[0]%2,_visibleSize[1]+_visibleSize[1]%2];
@@ -1954,14 +1993,14 @@ HView = UtilMethods.extend({
1954
1993
 
1955
1994
  /** Returns the string width
1956
1995
  **/
1957
- stringWidth: function(_string, _length, _elemId, _extraCss){
1958
- return this.stringSize(_string, _length, _elemId, false, _extraCss)[0];
1996
+ stringWidth: function(_string, _length, _elemId, _customStyle){
1997
+ return this.stringSize(_string, _length, _elemId, false, _customStyle)[0];
1959
1998
  },
1960
1999
 
1961
2000
  /** Returns the string height.
1962
2001
  **/
1963
- stringHeight: function(_string, _length, _elemId, _extraCss){
1964
- return this.stringSize(_string, _length, _elemId, true, _extraCss)[1];
2002
+ stringHeight: function(_string, _length, _elemId, _customStyle){
2003
+ return this.stringSize(_string, _length, _elemId, true, _customStyle)[1];
1965
2004
  },
1966
2005
 
1967
2006
  /** Returns the X coordinate that has the scrolled position calculated.
@@ -2068,14 +2107,14 @@ HView = UtilMethods.extend({
2068
2107
  * nodes from the cache.
2069
2108
  *
2070
2109
  * = Parameters
2071
- * +_elementId+:: The id of the element in the element manager's cache
2110
+ * +_elemId+:: The id of the element in the element manager's cache
2072
2111
  * that is to be removed from the cache.
2073
2112
  *
2074
2113
  **/
2075
- unbindDomElement: function(_elementId) {
2076
- var _indexOfElementId = this._domElementBindings.indexOf(_elementId);
2114
+ unbindDomElement: function(_elemId) {
2115
+ var _indexOfElementId = this._domElementBindings.indexOf(_elemId);
2077
2116
  if (~_indexOfElementId) {
2078
- ELEM.del(_elementId);
2117
+ ELEM.del(_elemId);
2079
2118
  this._domElementBindings.splice(_indexOfElementId, 1);
2080
2119
  }
2081
2120
  },
@@ -5,7 +5,11 @@
5
5
  ***/
6
6
  var//RSence.Foundation
7
7
  HViewDefaults = HClass.extend({
8
-
8
+
9
+ /** Whether or not to draw when constructed.
10
+ */
11
+ autoDraw: true,
12
+
9
13
  /** The default label. A label is the "visual value" of a component that
10
14
  * operates on a "hidden" value.
11
15
  **/
@@ -17,7 +17,7 @@
17
17
  ***/
18
18
  var//RSence.Lists
19
19
  HListItems = HValueResponder.extend({
20
-
20
+
21
21
  constructor: function( _rect, _parent, _options ){
22
22
  if( _rect.hasAncestor && _rect.hasAncestor( HView ) ){
23
23
  _options = _parent;
@@ -43,7 +43,7 @@ HListItems = HValueResponder.extend({
43
43
  }
44
44
  }
45
45
  },
46
-
46
+
47
47
  die: function() {
48
48
  var _this = this;
49
49
  if(_this.valueObj){
@@ -52,7 +52,7 @@ HListItems = HValueResponder.extend({
52
52
  }
53
53
  _this.value = null;
54
54
  },
55
-
55
+
56
56
  /** = Description
57
57
  * Iterates through this.value array and calls
58
58
  * the setListItems function of the parent class.
@@ -82,7 +82,7 @@ HListItemControl = HControl.extend({
82
82
  i = 0;
83
83
  for ( ; i < _listItemsIn.length ; i++ ){
84
84
  _row = _listItemsIn[i];
85
- _rowType = COMM.Values.type( _row );
85
+ _rowType = this.typeChr( _row );
86
86
  // console.log('row:',_row,' rowType:',_rowType);
87
87
  // hashes
88
88
  if ( _rowType === 'h' ) {
@@ -110,6 +110,28 @@ HListItemControl = HControl.extend({
110
110
  return _listItems;
111
111
  },
112
112
 
113
+ isValueInList: function(_value){
114
+ var i=0, _row, _rowType, _listItems = this.listItems;
115
+ if(!_listItems){
116
+ !this.isProduction && console.log("No listItems");
117
+ return false;
118
+ }
119
+ for( ; i<_listItems.length; i++ ){
120
+ _row = _listItems[i];
121
+ _rowType = this.typeChr( _row );
122
+ if( _rowType === 'h' ){
123
+ if( _row.value === _value ){ return true; }
124
+ }
125
+ else if( _rowType === 'a' ){
126
+ if( _row[0] === _value ){ return true; }
127
+ }
128
+ else if( ~['s','n'].indexOf(_rowType) ){
129
+ if( _row === _value ){ return true; }
130
+ }
131
+ }
132
+ return false;
133
+ },
134
+
113
135
  setListItems: function( _listItems ){
114
136
  _listItems = this._cleanListItems(_listItems);
115
137
  }
@@ -0,0 +1,55 @@
1
+ HComboBoxInterface =
2
+ refreshValue: ->
3
+ @base()
4
+ if @menu?
5
+ if @menu.isValueInList(@value)
6
+ @menu.setValue(@value)
7
+ else
8
+ @menu.setValue(@value)
9
+ @menu.valueMatrix.setValue(-1)
10
+ drawSubviews: ->
11
+ @base()
12
+ @stepper = null
13
+ @options.withStepper = false
14
+ _menuOptions = @options.menuOptions
15
+ _menuOptions.value = @value unless _menuOptions.value
16
+ _menuOptions.enabled = @enabled
17
+ _menuOptions.hidden = @isHidden
18
+ _menuOptions.listItems = [] unless _menuOptions.listItems
19
+ @menu = HPopupMenu.extend(
20
+ refreshValue: ->
21
+ @base()
22
+ @parent.setValue(@value) unless @parent.value == @value or @value == null
23
+ _firstRect: true
24
+ menuItemViewRect: ->
25
+ if @_firstRect
26
+ @_firstRect = false
27
+ return [ -1000, -1000, @parent.rect.width, (@listItems.length or 1)*24 ]
28
+ w = @parent.rect.width-2
29
+ [ x, y ] = [ @pageX(), @pageY() ]
30
+ x += -2 - w + @rect.width
31
+ if @options.menuBelow
32
+ y += @parent.rect.height
33
+ _rect = [ x, y, w, (@listItems.length or 1)*24 ]
34
+ _rect
35
+ repositionMenuItems: ->
36
+ @menuItemView.setRect( @menuItemViewRect() )
37
+ @menuItemView.drawRect()
38
+ drawSubviews: ->
39
+ @base()
40
+ @setMarkupOfPart('bg','&#9662;')
41
+ @setStyleOfPart('bg',
42
+ lineHeight: (@rect.height+2)+'px'
43
+ verticalAlign: 'middle'
44
+ borderLeft: '1px solid #ccc'
45
+ )
46
+ @refreshValue()
47
+ ).new( [null,-1,14,@rect.height,0,null], @, _menuOptions )
48
+ @_extraLabelRight += 14
49
+ if @unitSuffix
50
+ ELEM.setStyle(@unitSuffix.elemId,'paddingRight','14px')
51
+ @unitSuffix.drawRect()
52
+ @setStyleOfPart('label','right',this._extraLabelRight+'px')
53
+ @menu.bringToFront()
54
+ HComboBox = HTextControl.extend(HComboBoxInterface)
55
+ HNumericComboBox = HNumericTextControl.extend(HComboBoxInterface)
@@ -5,9 +5,9 @@
5
5
  ***/
6
6
  var//RSence.Menus
7
7
  HMiniMenu = HRadioButtonList.extend({
8
-
8
+
9
9
  componentName: 'minimenu',
10
-
10
+
11
11
  defaultEvents: {
12
12
  draggable: true,
13
13
  mouseUp: true,
@@ -15,12 +15,25 @@ HMiniMenu = HRadioButtonList.extend({
15
15
  resize: true
16
16
  },
17
17
 
18
+ markupElemNames: [ 'bg', 'control', 'label' ],
19
+
20
+ controlDefaults: HRadioButtonList.prototype.controlDefaults.extend({
21
+ itemStyle: {
22
+ 'background-color': '#f6f6f6',
23
+ 'border': '1px solid #999',
24
+ 'overflow': 'auto',
25
+ 'overflow-x': 'hidden',
26
+ 'display': 'none',
27
+ 'opacity': 1
28
+ }
29
+ }),
30
+
18
31
  subComponentHeight: 15,
19
32
 
20
33
  resize: function(){
21
34
  this.repositionMenuItems();
22
35
  },
23
-
36
+
24
37
  repositionMenuItems: function(){
25
38
  var
26
39
  x = this.pageX(),
@@ -55,14 +68,15 @@ HMiniMenu = HRadioButtonList.extend({
55
68
 
56
69
  click: function(){
57
70
  if(!this.active){return false;}
58
- if( ELEM.getStyle(this.menuItemView.elemId,'visibility',true) === 'hidden' ) {
71
+ if( !this._menuShown || this._menuShowTime+500 > this.msNow() ) {
59
72
  this.menuShow();
60
- }else{
73
+ }
74
+ else{
61
75
  this.menuHide();
62
76
  }
63
77
  return false;
64
78
  },
65
-
79
+
66
80
  refreshValue: function(){
67
81
  this.base();
68
82
  if(this.listItems && this.listItems.length !== 0 && this.valueMatrix !== undefined ) {
@@ -74,19 +88,42 @@ HMiniMenu = HRadioButtonList.extend({
74
88
  }
75
89
  }
76
90
  },
77
-
91
+
92
+ _menuShowTime: 0,
93
+ _menuShown: false,
78
94
  menuShow: function(){
95
+ if(this._menuShown){
96
+ return false;
97
+ }
98
+ this._menuShown = true;
99
+ this._menuShowTime = this.msNow();
79
100
  this.repositionMenuItems();
80
101
  if( this._menuItemViewShowPos ){
81
102
  var m = this._menuItemViewShowPos, x=m[0], y=m[1];
82
103
  this.menuItemView.offsetTo( x, y );
83
104
  }
84
105
  this.menuItemView.bringToFront();
106
+ var _menu = this;
107
+ this.pushTask( function(){
108
+ _menu._hideElemId = ELEM.make( 0 );
109
+ ELEM.setStyles( _menu._hideElemId, {
110
+ position: 'absolute', left: 0, top: 0, right: 0, bottom: 0//, backgroundColor: '#000', opacity: 0.2
111
+ } );
112
+ Event.observe( ELEM.get( _menu._hideElemId ), 'mousedown', function(e){_menu.menuHide();EVENT.mouseDown(e);return false;} );
113
+ ELEM.setStyle( _menu._hideElemId, 'z-index', ELEM.getStyle(_menu.menuItemView.elemId,'z-index')-1 );
114
+ } );
85
115
  this.menuItemView.show();
86
116
  return true;
87
117
  },
88
-
118
+
89
119
  menuHide: function(){
120
+ if( this._hideElemId ) {
121
+ ELEM.del( this._hideElemId );
122
+ this._hideElemId = null;
123
+ delete this._hideElemId;
124
+ }
125
+ this._menuShown = false;
126
+ this._menuShowTime = 0;
90
127
  if( this.menuItemView ){
91
128
  if( this._menuItemViewHidePos ){
92
129
  var m = this._menuItemViewHidePos, x=m[0], y=m[1];
@@ -96,21 +133,21 @@ HMiniMenu = HRadioButtonList.extend({
96
133
  this.menuItemView.hide();
97
134
  }
98
135
  },
99
-
136
+
100
137
  startDrag: function(x,y){
101
- this.dragStart = [x,y];
138
+ this.dragStart = [x,y,this.msNow()];
102
139
  if(!this.active){return false;}
103
140
  this.menuShow();
104
141
  return false;
105
142
  },
106
-
143
+
107
144
  lostActiveStatus: function(_newActive){
108
145
  if( _newActive && !_newActive.isChildOf( this.menuItemView ) ){
109
146
  this.menuHide();
110
147
  }
111
148
  this.base(_newActive);
112
149
  },
113
-
150
+
114
151
  gainedActiveStatus: function(_prevActive){
115
152
  if( _prevActive && _prevActive.isChildOf( this.menuItemView ) ){
116
153
  this.menuHide();
@@ -119,8 +156,8 @@ HMiniMenu = HRadioButtonList.extend({
119
156
  },
120
157
 
121
158
  endDrag: function(x,y){
122
- if( (Math.round(this.dragStart[0]*0.2)===Math.round(x*0.2)) &&
123
- (Math.round(this.dragStart[1]*0.2)===Math.round(y*0.2))
159
+ if(((Math.round(this.dragStart[0]*0.2)===Math.round(x*0.2)) &&
160
+ (Math.round(this.dragStart[1]*0.2)===Math.round(y*0.2)))
124
161
  ){
125
162
  this.menuShow();
126
163
  }
@@ -129,8 +166,13 @@ HMiniMenu = HRadioButtonList.extend({
129
166
  }
130
167
  return false;
131
168
  },
132
-
169
+
133
170
  die: function(){
171
+ if( this._hideElemId ) {
172
+ ELEM.del( this._hideElemId );
173
+ this._hideElemId = null;
174
+ delete this._hideElemId;
175
+ }
134
176
  this.valueMatrix = null;
135
177
  var _menuItemView = this.menuItemView;
136
178
  this.base();
@@ -142,28 +184,17 @@ HMiniMenu = HRadioButtonList.extend({
142
184
  return [ 0-this.rect.width, 0-this.rect.height, this.rect.width, 10 ];
143
185
  },
144
186
  drawSubviews: function(){
145
- var
146
- itemStyle = {
147
- 'background-color': '#f6f6f6',
148
- 'border': '1px solid #999',
149
- 'overflow': 'auto',
150
- 'overflow-x': 'hidden',
151
- 'display': 'none'
152
- };
153
- if(!BROWSER_TYPE.ie){
154
- itemStyle.opacity = 0.9;
155
- }
156
187
  this.menuItemView = HView.nu(
157
188
  // [ this.rect.left, this.rect.top, this.rect.width, 10 ],
158
189
  this.menuItemViewRect(),
159
190
  this.app, {
160
191
  visible: false,
161
- style: itemStyle,
192
+ style: this.options.itemStyle,
162
193
  logicParent: this
163
194
  }
164
195
  );
165
196
  },
166
-
197
+
167
198
  setListItems: function(_listItems){
168
199
  this.base(_listItems);
169
200
  this.valueMatrix = this.menuItemView.valueMatrix;
@@ -173,7 +204,7 @@ HMiniMenu = HRadioButtonList.extend({
173
204
  this.menuShow();
174
205
  }
175
206
  },
176
-
207
+
177
208
  createComponent: function( i, _label ){
178
209
  return HMiniMenuItem.nu(
179
210
  [ 0, (i*this.subComponentHeight), null, this.subComponentHeight, 0, null ],
@@ -182,5 +213,5 @@ HMiniMenu = HRadioButtonList.extend({
182
213
  }
183
214
  );
184
215
  }
185
-
216
+
186
217
  });
@@ -3,8 +3,7 @@
3
3
  .minimenu_edge_left,
4
4
  .minimenu_center,
5
5
  .minimenu_edge_right,
6
- .minimenu_label,
7
- .minimenu_antiselect {
6
+ .minimenu_label {
8
7
  position: absolute;
9
8
  top: 0px; height: 15px;
10
9
  }
@@ -57,7 +56,3 @@
57
56
  .disabled .minimenu_control {
58
57
  opacity: 0.8;
59
58
  }
60
-
61
- .minimenu_antiselect {
62
- left: 0px; right: 0px;
63
- }
@@ -1,7 +1,8 @@
1
1
  <div class="minimenu_control" id="control]I[">
2
- <div class="minimenu_edge_left"></div>
3
- <div class="minimenu_center"></div>
4
- <div class="minimenu_edge_right"></div>
2
+ <span id="bg]I[">
3
+ <div class="minimenu_edge_left"></div>
4
+ <div class="minimenu_center"></div>
5
+ <div class="minimenu_edge_right"></div>
6
+ </span>
5
7
  <div class="minimenu_label" id="label]I[">#{this.label}</div>
6
- <div class="minimenu_antiselect"></div>
7
8
  </div>