rsence-pre 3.0.0.9 → 3.0.0.10

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/client/ext/Rakefile +18 -0
  4. data/client/js/controls/button/themes/default/button.html +1 -1
  5. data/client/js/controls/checkbox/checkbox.js +9 -4
  6. data/client/js/controls/checkbox/themes/default/checkbox.css +19 -29
  7. data/client/js/controls/checkbox/themes/default/checkbox.html +8 -6
  8. data/client/js/controls/dialogs/sheet/themes/default/sheet.css +25 -30
  9. data/client/js/controls/dialogs/sheet/themes/default/sheet.html +10 -10
  10. data/client/js/controls/numerictextcontrol/numerictextcontrol.coffee +7 -14
  11. data/client/js/controls/passwordcontrol/passwordcontrol.js +1 -5
  12. data/client/js/controls/radiobutton/themes/default/radiobutton.css +21 -31
  13. data/client/js/controls/radiobutton/themes/default/radiobutton.html +8 -6
  14. data/client/js/controls/searchfield/themes/default/searchfield.css +1 -1
  15. data/client/js/controls/sliders/slider/themes/default/slider.css +3 -3
  16. data/client/js/controls/sliders/vslider/themes/default/vslider.css +3 -3
  17. data/client/js/controls/stepper/themes/default/stepper.css +1 -1
  18. data/client/js/controls/stringview/stringview.js +9 -16
  19. data/client/js/controls/stringview/themes/default/stringview.css +10 -2
  20. data/client/js/controls/tab/themes/default/tab.css +3 -3
  21. data/client/js/controls/textarea/textarea.js +1 -3
  22. data/client/js/controls/textcontrol/textcontrol.coffee +173 -36
  23. data/client/js/controls/textcontrol/themes/default/textcontrol.css +64 -100
  24. data/client/js/controls/textcontrol/themes/default/textcontrol.html +14 -19
  25. data/client/js/controls/uploader/themes/default/uploader.css +1 -1
  26. data/client/js/controls/window/themes/default/window.css +8 -8
  27. data/client/js/core/elem/elem.coffee +6 -4
  28. data/client/js/core/event/event.js +6 -0
  29. data/client/js/datetime/datepicker/datepicker.coffee +7 -3
  30. data/client/js/foundation/eventmanager/eventmanager.coffee +9 -4
  31. data/client/js/foundation/thememanager/thememanager.coffee +8 -1
  32. data/client/js/foundation/view/view.js +19 -4
  33. data/client/js/menus/combobox/combobox.coffee +2 -2
  34. data/client/js/menus/menuitem/themes/default/menuitem.css +15 -27
  35. data/client/js/menus/menuitem/themes/default/menuitem.html +2 -4
  36. data/client/js/menus/minimenu/minimenu.js +11 -3
  37. data/client/js/menus/minimenu/themes/default/minimenu.css +23 -18
  38. data/client/js/menus/minimenu/themes/default/minimenu.html +6 -8
  39. data/client/js/menus/minimenuitem/minimenuitem.js +1 -1
  40. data/client/js/menus/minimenuitem/themes/default/minimenuitem.css +15 -27
  41. data/client/js/menus/minimenuitem/themes/default/minimenuitem.html +2 -4
  42. data/client/js/menus/popupmenu/themes/default/popupmenu.css +27 -19
  43. data/client/js/menus/popupmenu/themes/default/popupmenu.html +6 -8
  44. data/plugins/client_pkg/lib/client_pkg_build.rb +33 -4
  45. metadata +3 -7
  46. data/client/js/controls/passwordcontrol/themes/default/passwordcontrol.css +0 -0
  47. data/client/js/controls/passwordcontrol/themes/default/passwordcontrol.html +0 -18
  48. data/client/js/controls/stringview/themes/default/stringview.html +0 -1
  49. data/client/js/controls/textarea/themes/default/textarea.css +0 -36
  50. data/client/js/controls/textarea/themes/default/textarea.html +0 -20
@@ -20,17 +20,21 @@ HTextControl = HControl.extend
20
20
  click: true
21
21
  contextMenu: true
22
22
 
23
+ multiline: false
23
24
  controlDefaults: HControlDefaults.extend
25
+ labelPadding: 2
24
26
  labelStyle:
25
27
  textIndent: 0
26
28
  fontSize: '10px'
29
+ lineHeight: '14px'
27
30
  color: '#666'
28
- labelWidth: 'auto'
31
+ labelWidth: 'auto'
29
32
  refreshAfter: 0.0 # amount of milliseconds to wait for a refresh from the input field
30
33
  refreshOnBlur: true
31
34
  refreshOnInput: true
32
- refreshOnIdle: true
35
+ refreshOnIdle: false
33
36
  focusOnCreate: false
37
+ unit: false # unit suffix
34
38
 
35
39
  ## This flag is true, when the text input field has focus.
36
40
  hasTextFocus: false
@@ -40,16 +44,17 @@ HTextControl = HControl.extend
40
44
  ###
41
45
  contextMenu: -> true
42
46
 
47
+ markupElemNames: ['value','invalid','label','subview','bg']
48
+
43
49
  ### = Description
44
50
  ## The refreshLabel method sets the title property of the text
45
51
  ## field, essentially creating a tooltip using the label.
46
52
  ###
53
+ labelPadding: 2
47
54
  refreshLabel: ->
48
55
  return unless @label
49
- if @markupElemIds? and @markupElemIds.label?
50
- @setAttrOfPart( 'label', 'title', @label )
51
- else
52
- return
56
+ return unless @markupElemIds? and @markupElemIds.label?
57
+ @setAttrOfPart( 'label', 'title', @label )
53
58
  if @_labelView?
54
59
  @_labelView.setLabel( @label )
55
60
  else
@@ -58,25 +63,94 @@ HTextControl = HControl.extend
58
63
  style: @options.labelStyle
59
64
  )
60
65
  if @options.labelWidth == 'auto'
61
- _labelWidth = @_labelView.stringWidth( @label, null, @_labelView.markupElemIds.value )+4
66
+ ELEM.flushElem([@_labelView.elemId])
67
+ _labelWidth = @_labelView.stringWidth( @label )
62
68
  else
63
69
  _labelWidth = @options.labelWidth
70
+ _labelWidth += @options.labelPadding || @labelPadding
64
71
  @_labelView.rect.setWidth( _labelWidth )
65
72
  @_labelView.drawRect()
66
- if @componentName == 'textarea'
73
+ if @multiline
67
74
  @setStyleOfPart('value','textIndent',_labelWidth+'px')
68
75
  else
69
76
  @setStyleOfPart('label','left',_labelWidth+'px')
70
77
 
71
- drawSubviews: ->
72
- ELEM.setStyle(@elemId,'overflow','visible')
78
+ _clearFocusBlurEvent: ->
79
+ _elemId = @markupElemIds.value
80
+ Event.stopObserving(_elemId,'focus',=>@textFocus())
81
+ Event.stopObserving(_elemId,'blur',=>@textBlur())
82
+
83
+ _invalidChar: '〰'
84
+ _setInvalidMarker: ->
85
+ _str = @getInputElement().value
86
+ _strLen = _str.length
87
+ if @fieldType == 'password'
88
+ _str = ''
89
+ for i in [1.._strLen]
90
+ _str += '•'
91
+ w = @stringWidth(_str,null,@markupElemIds.label,{
92
+ fontFamily: @styleOfPart('value','fontFamily')
93
+ fontSize: @styleOfPart('value','fontSize')
94
+ fontWeight: @styleOfPart('value','fontWeight')
95
+ whiteSpace: 'pre'
96
+ })
97
+ _invaCount = Math.ceil(w/@_invalidCharWidth)+1
98
+ _istr = ''
99
+ _align = @styleOfPart('value','textAlign')
100
+ @setStyleOfPart('invalid','textAlign',_align)
101
+ [ _left, _right ] = [
102
+ parseInt( @styleOfPart('value','left'), 10 ),
103
+ parseInt( @styleOfPart('value','right'), 10 )
104
+ ]
105
+ [ _pLeft, _pRight ] = [
106
+ parseInt( @styleOfPart('value','paddingLeft'), 10 ),
107
+ parseInt( @styleOfPart('value','paddingRight'), 10 )
108
+ ]
109
+ [ _mLeft, _mRight ] = [
110
+ parseInt( @styleOfPart('value','marginLeft'), 10 ),
111
+ parseInt( @styleOfPart('value','marginRight'), 10 )
112
+ ]
113
+ if _align == 'right'
114
+ @setStyleOfPart('invalid','left','auto')
115
+ @setStyleOfPart('invalid','right',(_right+_pRight)+'px')
116
+ else
117
+ @setStyleOfPart('invalid','right','auto')
118
+ @setStyleOfPart('invalid','left',(_left+_pLeft+_mLeft)+'px')
119
+ @setStyleOfPart('invalid','width',w+'px')
120
+ @setStyleOfPart('invalid','visibility','inherit')
121
+ _istr += @_invalidChar for [0.._invaCount]
122
+ @setMarkupOfPart('invalid',_istr)
123
+ _unsetInvalidMarker: ->
124
+ @setMarkupOfPart('invalid','')
125
+ @setStyleOfPart('invalid','visibility','hidden')
126
+
127
+ setValid: (_state)-> # true == valid, false == invalid
128
+ @_isValid = _state
129
+ if _state
130
+ @_unsetInvalidMarker()
131
+ else
132
+ @_setInvalidMarker()
133
+
134
+ fieldType: 'text'
135
+ drawMarkup: ->
73
136
  @base()
137
+ @_invalidCharWidth = @stringWidth(@_invalidChar,null,@markupElemIds.invalid)
138
+ _parentId = @markupElemIds.label
139
+ if @multiline
140
+ _elemId = ELEM.make(_parentId,'textarea')
141
+ else
142
+ _elemId = ELEM.make(_parentId,'input',{attr:{type:@fieldType,value:@value}})
143
+ @markupElemIds.value = _elemId
144
+ @setCSSClass('value','input')
145
+ Event.observe(_elemId,'focus',=>@textFocus())
146
+ Event.observe(_elemId,'blur',=>@textBlur())
74
147
  if @options.focusOnCreate
75
148
  @getInputElement().focus()
76
149
  @setSelectionRange( @value.length, @value.length ) if @typeChr(@value) == 's'
77
150
 
78
- lostActiveStatus: ->
79
- if @markupElemIds? && @markupElemIds.value?
151
+ lostActiveStatus: (_prevActive)->
152
+ @base(_prevActive)
153
+ if @markupElemIds? and @markupElemIds.value? and _prevActive != @
80
154
  ELEM.get( @markupElemIds.value ).blur()
81
155
  @textBlur()
82
156
 
@@ -86,12 +160,14 @@ HTextControl = HControl.extend
86
160
  @setStyleOfPart('value', _name, _value, _cacheOverride)
87
161
 
88
162
  click: ->
89
- @getInputElement().focus()
163
+ @getInputElement().focus() unless @hasTextFocus
90
164
 
91
165
  setEnabled: (_flag)->
92
166
  @base(_flag)
93
167
  if @markupElemIds? and @markupElemIds.value?
94
168
  ELEM.get(@markupElemIds.value).disabled = !@enabled
169
+ else
170
+ @pushTask => @setEnabled(_flag)
95
171
 
96
172
  _clipboardEventTimer: null
97
173
  _getChangeEventFn: ->
@@ -130,6 +206,7 @@ HTextControl = HControl.extend
130
206
  ##
131
207
  ###
132
208
  textFocus: ->
209
+ return if @hasTextFocus
133
210
  EVENT.changeActiveControl( @ )
134
211
  @hasTextFocus = true
135
212
  @_setChangeEventFn()
@@ -140,6 +217,7 @@ HTextControl = HControl.extend
140
217
  ## Called when the input field loses focus.
141
218
  ###
142
219
  textBlur: ->
220
+ return unless @hasTextFocus
143
221
  @hasTextFocus = false
144
222
  @_clearChangeEventFn()
145
223
  if @options.refreshOnBlur
@@ -147,8 +225,8 @@ HTextControl = HControl.extend
147
225
  @refreshValue()
148
226
  true
149
227
 
150
- idle: ->
151
- @refreshAfter() if @hasTextFocus and @options.refreshOnIdle and @options.refreshOnInput
228
+ # idle: ->
229
+ # @refreshAfter() if @hasTextFocus and @options.refreshOnIdle and @options.refreshOnInput
152
230
 
153
231
  refreshValue: ->
154
232
  @setTextFieldValue( @value )
@@ -157,8 +235,7 @@ HTextControl = HControl.extend
157
235
  ## Placeholder method for validation of the value.
158
236
  ##
159
237
  ###
160
- validateText: (_value)->
161
- @fieldToValue(_value)
238
+ validateText: (_value)-> @fieldToValue(_value)
162
239
 
163
240
  ### = Description
164
241
  ## Returns the input element or null, if no input element created (yet).
@@ -172,10 +249,8 @@ HTextControl = HControl.extend
172
249
  ###
173
250
  getTextFieldValue: ->
174
251
  _inputElement = @getInputElement()
175
- if _inputElement?
176
- return _inputElement.value
177
- else
178
- return ''
252
+ return _inputElement.value if _inputElement?
253
+ ''
179
254
 
180
255
  valueToField: (_value)-> _value
181
256
  fieldToValue: (_value)-> _value
@@ -191,8 +266,11 @@ HTextControl = HControl.extend
191
266
  return unless _inputElement?
192
267
  [ _selectionStart, _selectionEnd ] = @getSelectionRange()
193
268
  _value = @valueToField(_value)
194
- _inputElement.value = _value if _inputElement.value != _value.toString()
195
- @setSelectionRange( _selectionStart, _selectionEnd )
269
+ @_lastFieldValue = _value
270
+ unless @hasTextFocus
271
+ _inputElement.value = _value if _inputElement.value != _value.toString()
272
+ @setSelectionRange( _selectionStart, _selectionEnd )
273
+ @setValid(true) if _inputElement.value == _value
196
274
 
197
275
  # returns a random number prefixed and suffixed with '---'
198
276
  _randomMarker: -> '---'+Math.round((1+Math.random())*10000)+'---'
@@ -202,13 +280,14 @@ HTextControl = HControl.extend
202
280
  clearTimeout(@_refreshTimer) if @_refreshTimer
203
281
  @_refreshTimer = null
204
282
  @_clearChangeEventFn()
283
+ @_clearFocusBlurEvent()
205
284
  @base()
206
285
 
207
286
  ### = Description
208
287
  ## Returns the selection (or text cursor position) of the input element
209
288
  ## as an +Array+ like +[ startOffset, endOffset ]+.
210
289
  ###
211
- getSelectionRange: ->
290
+ _getLeftAlignedSelectionRange: ->
212
291
  _inputElement = @getInputElement()
213
292
  if _inputElement == null or @hasTextFocus == false
214
293
  _rangeArr = [ 0, 0 ]
@@ -239,25 +318,52 @@ HTextControl = HControl.extend
239
318
  else
240
319
  _rangeArr = [ 0, 0 ]
241
320
  return _rangeArr
242
-
321
+ _getRightAlignedSelectionRange: ->
322
+ _inputElement = @getInputElement()
323
+ _inputValue = _inputElement.value
324
+ _valueLength = _inputValue.length
325
+ if _inputElement == null or @hasTextFocus == false
326
+ _rangeArr = [ 0, 0 ]
327
+ ## Other browsers
328
+ else if _inputElement.selectionStart
329
+ _rangeArr = [ _valueLength-_inputElement.selectionStart, _valueLength-_inputElement.selectionEnd ]
330
+ ## Internet Explorer:
331
+ else if document.selection
332
+ # create a range object
333
+ _range = document.selection.createRange()
334
+ # original range text
335
+ _rangeText = _range.text
336
+ _rangeLength = _rangeText.length
337
+ # make a copy of the text and replace \r\n with \n
338
+ _origValue = _inputElement.value.replace(/\r\n/g, "\n")
339
+ # create random marker to replace the text with
340
+ _marker = @_randomMarker()
341
+ # re-generate marker if it's found in the text.
342
+ _marker = @_randomMarker() while ~_origValue.indexOf( _marker )
343
+ _markerLength = _marker.length
344
+ # temporarily set the text of the selection to the unique marker
345
+ _range.text = _marker
346
+ _markerValue = _inputElement.value.replace(/\r\n/g, "\n")
347
+ _range.text = _rangeText
348
+ _markerIndex = _markerValue.indexOf( _marker )
349
+ _rangeArr = [ _valueLength-_markerIndex, _valueLength-_markerIndex + _rangeLength ]
350
+ ## No support:
351
+ else
352
+ _rangeArr = [ 0, 0 ]
353
+ return _rangeArr
354
+ getSelectionRange: ->
355
+ return @_getRightAlignedSelectionRange() if @styleOfPart('value','textAlign') == 'right'
356
+ @_getLeftAlignedSelectionRange()
243
357
  _refreshTimer: null
244
358
  _lastFieldValue: null
245
359
  refreshAfter: ->
246
360
  _fieldValue = @getTextFieldValue()
247
- if @_lastFieldValue == null or _fieldValue != @_lastFieldValue
361
+ if not @_lastFieldValue? or _fieldValue != @_lastFieldValue
248
362
  @_lastFieldValue = _fieldValue
249
363
  if @_refreshTimer
250
364
  clearTimeout( @_refreshTimer )
251
365
  @_refreshTimer = null
252
- if @options.refreshAfter and @options.refreshAfter > 0
253
- _this = @
254
- @_refreshTimer = setTimeout( (->
255
- _this._updateValueFromField()
256
- ), @options.refreshAfter*1000 )
257
- else
258
- @_updateValueFromField()
259
- # @setValue( @validateText( @getTextFieldValue() ) )
260
- # @refreshValue()
366
+ @pushTask => @_updateValueFromField()
261
367
 
262
368
  ### = Description
263
369
  ## Sets the selection (or text cursor position) of the input element.
@@ -281,6 +387,10 @@ HTextControl = HControl.extend
281
387
  _selectionEnd = _selectionStart
282
388
  _inputElement = @getInputElement()
283
389
  return if _inputElement == null or @hasTextFocus == false
390
+ if @styleOfPart('value','textAlign') == 'right'
391
+ _len = _inputElement.value.length
392
+ _selectionStart = _len - _selectionStart
393
+ _selectionEnd = _len - _selectionEnd
284
394
  # Internet Explorer
285
395
  if _inputElement.createTextRange
286
396
  _range = _inputElement.createTextRange()
@@ -300,6 +410,33 @@ HTextControl = HControl.extend
300
410
  ###
301
411
  textEnter: ->
302
412
  @refreshAfter() if @options.refreshOnInput
303
- false
413
+ true
414
+
415
+ drawSubviews: ->
416
+ @drawUnit()
417
+
418
+ _extraLabelRight: 0
419
+ drawUnit: ->
420
+ if @options.unit
421
+ _style =
422
+ fontSize: @styleOfPart('value','fontSize')
423
+ fontFamily: @styleOfPart('value','fontFamily')
424
+ fontWeight: @styleOfPart('value','fontWeight')
425
+ color: @styleOfPart('value','color')
426
+ whiteSpace: 'pre'
427
+ textAlign: 'right'
428
+ verticalAlign: 'middle'
429
+ lineHeight: '100%'
430
+ ELEM.flush()
431
+ [ w, h ] = @stringSize(@options.unit,null,@markupElemIds.label,true,_style)
432
+ h = ELEM.getSize(@markupElemIds.label)[1]
433
+ _style.lineHeight = h+'px'
434
+ _unitRect = [null,1,w+4,h-2,4,1]
435
+ @unitSuffix = HLabel.new(_unitRect,@,
436
+ label: @options.unit
437
+ style: _style
438
+ )
439
+ @_extraLabelRight += @unitSuffix.rect.width
440
+ @setStyleOfPart('label','right',this._extraLabelRight+'px')
304
441
 
305
442
  HTextField = HTextControl
@@ -1,137 +1,101 @@
1
-
2
- .default .textcontrol_input {
3
- position: absolute;
4
- display: block;
1
+ .default.textcontrol {
2
+ overflow: visible;
3
+ }
4
+ .default.textcontrol > .input_parent {
5
+ position: absolute; z-index: 2;
6
+ left: 1px; top: 1px; right: 1px; bottom: 1px;
7
+ }
8
+ .default.textcontrol > .input_parent > .input {
9
+ position: absolute; display: block;
5
10
  font-family: Helvetica, Arial, sans-serif;
6
- font-size: 13px;
7
- color: #000;
11
+ font-size: 13px; color: #000; resize: none;
8
12
  background-color: transparent;
9
13
  vertical-align: middle;
10
- border: 0;
11
- left: 0; top: 0;
12
- #{(
13
- (BROWSER_TYPE.firefox||BROWSER_TYPE.ie7||BROWSER_TYPE.ie8||BROWSER_TYPE.ie9||BROWSER_TYPE.ie10||BROWSER_TYPE.opera)?
14
- 'padding-left:2px;width:100% !important;height:90% !important;':
15
- 'padding:2px;right:0px;bottom:0px;width:auto;height:auto;'
16
- )}
14
+ border: 0; left: 0; top: 0;
15
+ right: 0; bottom: 0;
16
+ width: 100%; height: 100%;
17
+ -moz-box-sizing: border-box;
18
+ -webkit-box-sizing: border-box;
19
+ box-sizing: border-box;
17
20
  }
18
-
19
- .default .textcontrol_input:focus {
20
- outline-color: transparent;
21
- outline-style: none;
21
+ .default.textcontrol > .input_parent > .input::-ms-clear {
22
+ display: none;
22
23
  }
23
-
24
- .default .disabled .textcontrol_input {
25
- color: #333;
24
+ .default.textcontrol.disabled > .input_parent > .input { color: #333; }
25
+ .default.textcontrol > .input_parent > .input:focus {
26
+ outline-color: transparent; outline-style: none;
27
+ }
28
+ .default.textcontrol > .input_parent > .input_invalid {
29
+ position: absolute; white-space: nowrap; overflow: hidden;
30
+ vertical-align: bottom; visibility: hidden;
31
+ bottom: 1px; font-size: 10px; line-height: 6px;
32
+ color: #c00; z-index: 0; font-weight: bold;
26
33
  }
27
34
 
28
- .default .textcontrol_subview {
35
+
36
+
37
+ .default.textcontrol > .subview {
29
38
  position: absolute;
30
39
  left: 0; top: 0; right: 0; bottom: 0;
31
40
  z-index: 1;
32
41
  }
42
+ .default.textcontrol.active > .subview { display: none; }
33
43
 
34
- .default .active>.textcontrol_subview {
35
- display: none;
36
- }
37
44
 
38
- .default .textcontrol_input_parent {
39
- position: absolute;
40
- z-index: 2;
41
- #{(
42
- ((BROWSER_TYPE.chrome && BROWSER_TYPE.mac)||BROWSER_TYPE.firefox||BROWSER_TYPE.ie7||BROWSER_TYPE.ie8||BROWSER_TYPE.ie9||BROWSER_TYPE.ie10||BROWSER_TYPE.opera)?
43
- 'left:0;padding-left:1px;top:0;right:4px;bottom:0;':
44
- 'left:-2px;top:-2px;right:-2px;bottom:-2px;'
45
- )}
46
- #{(BROWSER_TYPE.chrome && BROWSER_TYPE.mac)?'top:1px;':''}
47
- }
48
45
 
49
- .default .textcontrol_bg {
46
+ .default.textcontrol > .bg > .c {
50
47
  position: absolute;
51
48
  left: 2px; top: 2px; right: 2px; bottom: 2px;
52
49
  background-color: #fff;
53
50
  }
54
-
55
- .default .active>.textcontrol_bg {
51
+ .default.textcontrol.active > .bg > .c {
56
52
  left: 0; top: 0; right: 0; bottom: 0;
57
53
  -webkit-box-shadow: 0 0 3px #333;
58
54
  box-shadow: 0 0 3px #333;
59
55
  }
56
+ .default.textcontrol.disabled > .bg > .c { background-color: #eee; }
60
57
 
61
- .default .disabled .textcontrol_bg {
62
- background-color: #eee;
63
- }
64
-
65
-
66
- .default .textcontrol_ne,
67
- .default .textcontrol_nw,
68
- .default .textcontrol_se,
69
- .default .textcontrol_sw {
70
- position: absolute;
71
- width: 7px; height: 7px;
58
+ .default.textcontrol > .bg > .ne,
59
+ .default.textcontrol > .bg > .nw,
60
+ .default.textcontrol > .bg > .se,
61
+ .default.textcontrol > .bg > .sw {
62
+ position: absolute; width: 7px; height: 7px;
72
63
  background-repeat: no-repeat;
73
- background-image: #{this.getCssFilePath('textcontrol_parts1.png')};
64
+ background-image: #url(textcontrol_parts1.png);
74
65
  }
75
-
76
- .default .textcontrol_nw {
77
- left: 0; top: 0;
78
- background-position: 0 0;
66
+ .default.textcontrol > .bg > .nw {
67
+ left: 0; top: 0; background-position: 0 0;
79
68
  }
80
-
81
- .default .textcontrol_ne {
82
- right: 0; top: 0;
83
- background-position: -7px 0;
69
+ .default.textcontrol > .bg > .ne {
70
+ right: 0; top: 0; background-position: -7px 0;
84
71
  }
85
-
86
- .default .textcontrol_sw {
87
- left: 0; bottom: 0;
88
- background-position: 0 -7px;
72
+ .default.textcontrol > .bg > .sw {
73
+ left: 0; bottom: 0; background-position: 0 -7px;
89
74
  }
90
-
91
- .default .textcontrol_se {
92
- right: 0; bottom: 0;
93
- background-position: -7px -7px;
75
+ .default.textcontrol > .bg > .se {
76
+ right: 0; bottom: 0; background-position: -7px -7px;
94
77
  }
95
-
96
-
97
-
98
- .default .textcontrol_w,
99
- .default .textcontrol_e {
100
- position: absolute;
101
- width: 7px; top: 7px; bottom: 7px;
78
+ .default.textcontrol > .bg > .w,
79
+ .default.textcontrol > .bg > .e {
80
+ position: absolute; width: 7px; top: 7px; bottom: 7px;
102
81
  background-repeat: repeat-y;
103
- background-image: #{this.getCssFilePath('textcontrol_parts3.png')};
82
+ background-image: #url(textcontrol_parts3.png);
104
83
  }
105
-
106
- .default .textcontrol_w {
107
- left: 0;
108
- background-position: 0 0;
84
+ .default.textcontrol > .bg > .w {
85
+ left: 0; background-position: 0 0;
109
86
  }
110
-
111
- .default .textcontrol_e {
112
- right: 0;
113
- background-position: -7px 0;
87
+ .default.textcontrol > .bg > .e {
88
+ right: 0; background-position: -7px 0;
114
89
  }
115
-
116
-
117
-
118
- .default .textcontrol_n,
119
- .default .textcontrol_s {
120
- position: absolute;
121
- height: 7px; left: 7px; right: 7px;
90
+ .default.textcontrol > .bg > .n,
91
+ .default.textcontrol > .bg > .s {
92
+ position: absolute; height: 7px; left: 7px; right: 7px;
122
93
  background-repeat: repeat-x;
123
- background-image: #{this.getCssFilePath('textcontrol_parts2.png')};
94
+ background-image: #url(textcontrol_parts2.png);
124
95
  }
125
-
126
- .default .textcontrol_n {
127
- top: 0;
128
- background-position: 0 0;
96
+ .default.textcontrol > .bg > .n {
97
+ top: 0; background-position: 0 0;
129
98
  }
130
-
131
- .default .textcontrol_s {
132
- bottom: 0;
133
- background-position: 0 -7px;
99
+ .default.textcontrol > .bg > .s {
100
+ bottom: 0; background-position: 0 -7px;
134
101
  }
135
-
136
-
137
-
@@ -1,20 +1,15 @@
1
- <div class="textcontrol_bg" id="bg]I["></div>
2
-
3
- <div class="textcontrol_n"></div>
4
- <div class="textcontrol_s"></div>
5
- <div class="textcontrol_w"></div>
6
- <div class="textcontrol_e"></div>
7
-
8
- <div class="textcontrol_nw"></div>
9
- <div class="textcontrol_ne"></div>
10
- <div class="textcontrol_se"></div>
11
- <div class="textcontrol_sw"></div>
12
-
13
- <div id="subview]I[" class="textcontrol_subview"></div>
14
-
15
- <div id="label]I[" title="#{this.label}" class="textcontrol_input_parent">
16
- <input type="text" class="textcontrol_input" #{this.enabled?'':'disabled'}
17
- onfocus="HSystem.views[#{this.viewId}].textFocus();"
18
- onblur="HSystem.views[#{this.viewId}].textBlur();"
19
- id="value]I[" value="#{this.value}" />
1
+ <div class="bg" id="bg]I[">
2
+ <div class="n"></div>
3
+ <div class="s"></div>
4
+ <div class="w"></div>
5
+ <div class="e"></div>
6
+ <div class="c"></div>
7
+ <div class="nw"></div>
8
+ <div class="ne"></div>
9
+ <div class="se"></div>
10
+ <div class="sw"></div>
11
+ </div>
12
+ <div id="subview]I[" class="subview"></div>
13
+ <div id="label]I[" title="#{this.label}" class="input_parent">
14
+ <div class="input_invalid" id="invalid]I["></div>
20
15
  </div>
@@ -52,5 +52,5 @@
52
52
  .upload_progress .progress_indicator {
53
53
  position: absolute;
54
54
  right: 0px; top: 4px; width: 16px; height: 16px;
55
- background-image: #{this.getCssFilePath('upload_progress.gif')};
55
+ background-image: #url(upload_progress.gif);
56
56
  }
@@ -54,7 +54,7 @@
54
54
  }
55
55
 
56
56
  .window_titlebar * {
57
- background-image: #{this.getCssFilePath('window_parts1.png')};
57
+ background-image: #url(window_parts1.png);
58
58
  }
59
59
 
60
60
  .window_titlebar_edge_left {
@@ -80,7 +80,7 @@
80
80
  left: 24px; top: 0; right: 24px; height: 24px;
81
81
  background-position: 0 0;
82
82
  background-repeat: repeat-x;
83
- background-image: #{this.getCssFilePath('window_parts2.png')};
83
+ background-image: #url(window_parts2.png);
84
84
  }
85
85
 
86
86
  .inactive > .window_titlebar > .window_titlebar_center {
@@ -90,11 +90,11 @@
90
90
  .window_bg {
91
91
  left: 24px; top: 24px; right: 24px; bottom: 24px;
92
92
  background-repeat: repeat;
93
- background-image: #{this.getCssFilePath('window_bg_active.png')};
93
+ background-image: #url(window_bg_active.png);
94
94
  }
95
95
 
96
96
  .inactive > .window_bg {
97
- background-image: #{this.getCssFilePath('window_bg_inactive.png')};
97
+ background-image: #url(window_bg_inactive.png);
98
98
  }
99
99
 
100
100
  .window_body {
@@ -102,7 +102,7 @@
102
102
  }
103
103
 
104
104
  .window_body * {
105
- background-image: #{this.getCssFilePath('window_parts1.png')};
105
+ background-image: #url(window_parts1.png);
106
106
  }
107
107
 
108
108
  .window_body_edge_left {
@@ -146,7 +146,7 @@
146
146
  left: 24px; bottom: 0; right: 24px; height: 24px;
147
147
  background-repeat: repeat-x;
148
148
  background-position: 0 -24px;
149
- background-image: #{this.getCssFilePath('window_parts2.png')};
149
+ background-image: #url(window_parts2.png);
150
150
  }
151
151
 
152
152
  .inactive > .window_body > .window_body_edge_bottom {
@@ -183,7 +183,7 @@
183
183
  z-index: 10000;
184
184
  background-position: -59px -35px;
185
185
  font-size: 0;
186
- background-image: #{this.getCssFilePath('window_parts1.png')};
186
+ background-image: #url(window_parts1.png)
187
187
  }
188
188
 
189
189
  .inactive > .window_resize_se {
@@ -194,7 +194,7 @@
194
194
  .window_controls_collapse,
195
195
  .window_controls_zoom {
196
196
  top: 6px; width: 15px; height: 15px;
197
- background-image: #{this.getCssFilePath('window_buttons.png')};
197
+ background-image: #url(window_buttons.png)
198
198
  }
199
199
 
200
200
  .window_controls_close {
@@ -677,12 +677,14 @@ ELEM = HClass.extend
677
677
  _id = @_add( _elem )
678
678
  @_initCache( _id )
679
679
  if _options?
680
- if _options.attrs?
681
- if _options.attrs instanceof Array
682
- for _attr in _options.attrs
680
+ _attrs = _options.attrs if _options.attrs?
681
+ _attrs = _options.attr if _options.attr? and not _attr?
682
+ if _attrs?
683
+ if _attrs instanceof Array
684
+ for _attr in _attrs
683
685
  @setAttr( _id, _attr[0], _attr[1], true )
684
686
  else
685
- for _attrName, _attrValue of _options.attrs
687
+ for _attrName, _attrValue of _attrs
686
688
  @setAttr( _id, _attrName, _attrValue, true )
687
689
  if _options.styles
688
690
  @setStyles( _id, _options.styles )