sproutcore 1.6.0.1-java → 1.7.1.beta-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. data/CHANGELOG +21 -0
  2. data/Gemfile +5 -0
  3. data/Rakefile +26 -13
  4. data/VERSION.yml +2 -2
  5. data/lib/Buildfile +43 -4
  6. data/lib/buildtasks/build.rake +10 -0
  7. data/lib/buildtasks/helpers/file_rule.rb +22 -0
  8. data/lib/buildtasks/helpers/file_rule_list.rb +137 -0
  9. data/lib/buildtasks/manifest.rake +133 -122
  10. data/lib/frameworks/sproutcore/CHANGELOG.md +69 -2
  11. data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +1 -0
  12. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +28 -22
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +9 -5
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +1 -1
  15. data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +18 -13
  16. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +5 -3
  17. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +2 -0
  18. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +80 -0
  19. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +84 -116
  20. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +8 -5
  21. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +157 -157
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +5 -3
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +6 -6
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +10 -7
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +106 -0
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +18 -0
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +71 -1
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/attribute_bindings_test.js +38 -0
  29. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +47 -0
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +18 -18
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +42 -10
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +26 -1
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
  35. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +15 -2
  36. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +108 -108
  37. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
  38. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -4
  39. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +2 -2
  40. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +26 -0
  41. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +4 -1
  44. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +6 -0
  45. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +26 -5
  46. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +97 -96
  47. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -3
  48. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +17 -4
  49. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +7 -7
  50. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +7 -5
  51. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +12 -3
  52. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +23 -14
  53. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +5 -1
  54. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +28 -0
  55. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +235 -0
  56. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +363 -0
  57. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +250 -0
  58. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +92 -0
  59. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +25 -0
  60. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +33 -0
  61. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +76 -0
  62. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +50 -0
  63. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +143 -0
  64. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +258 -0
  65. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +1164 -0
  66. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +332 -0
  67. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +236 -0
  68. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +347 -0
  69. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +15 -0
  70. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +10 -0
  71. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +804 -0
  72. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +133 -0
  73. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +3 -3
  74. data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +3 -1
  75. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +3 -3
  76. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +2 -1
  77. data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +2 -1
  78. data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +2 -4
  79. data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +2 -4
  80. data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +2 -4
  81. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +2 -2
  82. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +29 -3
  83. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
  84. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +1 -1
  85. data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -1
  86. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +3 -3
  87. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -2
  88. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
  89. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
  90. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/segmented.css +1 -1
  91. data/lib/gen/app/templates/apps/@target_name@/Buildfile +3 -5
  92. data/lib/gen/app/templates/apps/@target_name@/resources/_theme.css +18 -0
  93. data/lib/gen/project/templates/@filename@/Buildfile +2 -2
  94. data/lib/sproutcore.rb +30 -5
  95. data/lib/sproutcore/builders.rb +1 -0
  96. data/lib/sproutcore/builders/chance_file.rb +9 -16
  97. data/lib/sproutcore/builders/html.rb +2 -1
  98. data/lib/sproutcore/builders/minify.rb +4 -35
  99. data/lib/sproutcore/builders/module.rb +38 -1
  100. data/lib/sproutcore/builders/split.rb +63 -0
  101. data/lib/sproutcore/builders/strings.rb +7 -1
  102. data/lib/sproutcore/helpers.rb +1 -1
  103. data/lib/sproutcore/helpers/css_split.rb +190 -0
  104. data/lib/sproutcore/helpers/entry_sorter.rb +2 -0
  105. data/lib/sproutcore/helpers/minifier.rb +40 -16
  106. data/lib/sproutcore/helpers/static_helper.rb +35 -17
  107. data/lib/sproutcore/models/manifest.rb +26 -0
  108. data/lib/sproutcore/models/target.rb +12 -1
  109. data/lib/sproutcore/rack.rb +1 -0
  110. data/lib/sproutcore/rack/proxy.rb +244 -225
  111. data/lib/sproutcore/rack/restrict_ip.rb +67 -0
  112. data/lib/sproutcore/rack/service.rb +8 -2
  113. data/lib/sproutcore/tools.rb +102 -46
  114. data/lib/sproutcore/tools/build.rb +91 -43
  115. data/lib/sproutcore/tools/gen.rb +2 -3
  116. data/lib/sproutcore/tools/manifest.rb +22 -16
  117. data/lib/sproutcore/tools/server.rb +21 -0
  118. data/spec/buildtasks/helpers/accept_list +22 -0
  119. data/spec/buildtasks/helpers/accept_list.rb +128 -0
  120. data/spec/buildtasks/helpers/list.json +11 -0
  121. data/spec/buildtasks/manifest/prepare_build_tasks/chance_2x_spec.rb +1 -39
  122. data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +0 -38
  123. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +4 -4
  124. data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +2 -2
  125. data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_indirect_spec.rb +7 -16
  126. data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_spec.rb +7 -17
  127. data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +11 -6
  128. data/spec/fixtures/builder_tests/Buildfile +2 -1
  129. data/spec/fixtures/builder_tests/apps/module_test/modules/required_module/core.js +0 -0
  130. data/spec/lib/builders/module_spec.rb +1 -1
  131. data/spec/spec_helper.rb +1 -0
  132. data/sproutcore.gemspec +4 -9
  133. data/vendor/chance/lib/chance.rb +25 -6
  134. data/vendor/chance/lib/chance/factory.rb +45 -0
  135. data/vendor/chance/lib/chance/instance.rb +173 -28
  136. data/vendor/chance/lib/chance/instance/data_url.rb +0 -29
  137. data/vendor/chance/lib/chance/instance/slicing.rb +57 -4
  138. data/vendor/chance/lib/chance/instance/spriting.rb +112 -21
  139. data/vendor/chance/lib/chance/parser.rb +80 -52
  140. data/vendor/sproutcore/SCCompiler.jar +0 -0
  141. data/vendor/sproutcore/lib/args4j-2.0.12.jar +0 -0
  142. data/vendor/sproutcore/lib/yuicompressor-2.4.2.jar +0 -0
  143. metadata +84 -25
@@ -0,0 +1,332 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /** @class
9
+
10
+ Displays a horizontal or vertical scroller.
11
+
12
+ You will not usually need to work with scroller views directly,
13
+ but you may override this class to implement your own custom scrollers.
14
+
15
+ Because the scroller uses the dimensions of its constituent elements to
16
+ calculate layout, you may need to override the default display metrics.
17
+
18
+ You can either create a subclass of ScrollerView with the new values, or
19
+ provide your own in your theme:
20
+
21
+ SC.mixin(SC.ScrollerView.prototype, {
22
+ scrollbarThickness: 14,
23
+ capLength: 18,
24
+ capOverlap: 14,
25
+ buttonOverlap: 11,
26
+ buttonLength: 41
27
+ });
28
+
29
+ You can change whether scroll buttons are displayed by setting the
30
+ hasButtons property.
31
+
32
+ @extends SC.View
33
+ @since SproutCore 1.6
34
+ */
35
+ SC.CoreScrollerView = SC.View.extend(
36
+ /** @scope SC.CoreScrollerView.prototype */{
37
+
38
+ /**
39
+ @type Array
40
+ @default ['sc-scroller-view']
41
+ @see SC.View#classNames
42
+ */
43
+ classNames: ['sc-scroller-view'],
44
+
45
+ /**
46
+ @type Array
47
+ @default ['thumbPosition', 'thumbLength', 'isEnabled', 'controlsHidden', 'capLength'
48
+ 'layoutDirection', 'hasButtons', 'value', 'controlsId', 'maximum', 'minimum']
49
+ @see SC.View#displayProperties
50
+ */
51
+ displayProperties: ['thumbPosition', 'thumbLength', 'isEnabled', 'controlsHidden',
52
+ 'layoutDirection', 'hasButtons', 'capLength',
53
+ 'value', 'controlsId', 'maximum', 'minimum'], // WAI-ARIA attrs
54
+
55
+ /**
56
+ The WAI-ARIA role for scroller view.
57
+
58
+ @type String
59
+ @default 'scrollbar'
60
+ @readOnly
61
+ */
62
+ ariaRole: 'scrollbar',
63
+
64
+ // ..........................................................
65
+ // PROPERTIES
66
+ //
67
+
68
+ /**
69
+ If YES, a click on the track will cause the scrollbar to scroll to that position.
70
+ Otherwise, a click on the track will cause a page down.
71
+
72
+ In either case, alt-clicks will perform the opposite behavior.
73
+
74
+ @type Boolean
75
+ @default NO
76
+ */
77
+ shouldScrollToClick: NO,
78
+
79
+ /**
80
+ WAI-ARIA ID to the control that this scroller is controlling.
81
+
82
+ @field
83
+ @type String
84
+ */
85
+ controlsIdBinding: SC.Binding.oneWay('.parentView*contentView.layerId'),
86
+
87
+ /**
88
+ @type Number
89
+ @observes value
90
+ @observes touchValue
91
+ */
92
+ displayValue: function () {
93
+ return this.get('value');
94
+ }.property("value").cacheable(),
95
+
96
+ /**
97
+ The value of the scroller.
98
+ The value represents the position of the scroller's thumb.
99
+
100
+ @field
101
+ @type Number
102
+ @observes maximum
103
+ @observes minimum
104
+ */
105
+ value: function (key, value) {
106
+ var minimum = this.get('minimum');
107
+ if (typeof value !== "undefined") {
108
+ this._scs_value = value;
109
+ }
110
+
111
+ value = this._scs_value || minimum; // default value is at top / left
112
+ return Math.max(Math.min(value, this.get('maximum')), minimum);
113
+ }.property('maximum', 'minimum').cacheable(),
114
+
115
+ /**
116
+ The portion of the track that the thumb should fill. Usually the
117
+ proportion will be the ratio of the size of the scroll view's content view
118
+ to the size of the scroll view.
119
+
120
+ Should be specified as a value between 0.0 (minimal size) and 1.0 (fills
121
+ the slot). Note that if the proportion is 1.0 then the control will be
122
+ disabled.
123
+
124
+ @type Number
125
+ @default 0.0
126
+ */
127
+ proportion: 0,
128
+
129
+ /**
130
+ The maximum offset value for the scroller. This will be used to calculate
131
+ the internal height/width of the scroller itself.
132
+
133
+ When set less than the height of the scroller, the scroller is disabled.
134
+
135
+ @type Number
136
+ @default 100
137
+ */
138
+ maximum: 100,
139
+
140
+ /**
141
+ The minimum offset value for the scroller. This will be used to calculate
142
+ the internal height/width of the scroller itself.
143
+
144
+ @type Number
145
+ @default 0
146
+ */
147
+ minimum: 0,
148
+
149
+ /**
150
+ YES to enable scrollbar, NO to disable it. Scrollbars will automatically
151
+ disable if the maximum scroll width does not exceed their capacity.
152
+
153
+ @field
154
+ @type Boolean
155
+ @default YES
156
+ @observes proportion
157
+ */
158
+ isEnabled: function (key, value) {
159
+ var enabled;
160
+ if (typeof value !== "undefined") {
161
+ this._scsv_isEnabled = value;
162
+ }
163
+ enabled = this._scsv_isEnabled;
164
+
165
+ return !SC.none(enabled) ? enabled : this.get('proportion') < 1;
166
+ }.property('proportion').cacheable(),
167
+
168
+ /** @private */
169
+ _scsv_isEnabled: undefined,
170
+
171
+ /**
172
+ Determine the layout direction. Determines whether the scrollbar should
173
+ appear horizontal or vertical. This must be set when the view is created.
174
+ Changing this once the view has been created will have no effect. Possible
175
+ values:
176
+
177
+ - SC.LAYOUT_VERTICAL
178
+ - SC.LAYOUT_HORIZONTAL
179
+
180
+ @type String
181
+ @default SC.LAYOUT_VERTICAL
182
+ */
183
+ layoutDirection: SC.LAYOUT_VERTICAL,
184
+
185
+ /**
186
+ Whether or not the scroller should display scroll buttons
187
+
188
+ @type Boolean
189
+ @default YES
190
+ */
191
+ hasButtons: YES,
192
+
193
+
194
+ // ..........................................................
195
+ // DISPLAY METRICS
196
+ //
197
+
198
+ /**
199
+ The width (if vertical scroller) or height (if horizontal scroller) of the
200
+ scrollbar.
201
+
202
+ @type Number
203
+ @default 14
204
+ */
205
+ scrollbarThickness: 14,
206
+
207
+ /**
208
+ Whether or not the scrollbar is translucent.
209
+ This effectively means you would like the scroller to be overlaid.
210
+
211
+ @type Boolean
212
+ @default NO
213
+ */
214
+ isTranslucent: NO,
215
+
216
+ /**
217
+ The width or height of the cap that encloses the track.
218
+
219
+ @type Number
220
+ @default 18
221
+ */
222
+ capLength: 18,
223
+
224
+ /**
225
+ The amount by which the thumb overlaps the cap.
226
+
227
+ @type Number
228
+ @default 14
229
+ */
230
+ capOverlap: 14,
231
+
232
+ /**
233
+ The width or height of the up/down or left/right arrow buttons. If the
234
+ scroller is not displaying arrows, this is the width or height of the end
235
+ cap.
236
+
237
+ @type Number
238
+ @defaut 41
239
+ */
240
+ buttonLength: 41,
241
+
242
+ /**
243
+ The amount by which the thumb overlaps the arrow buttons. If the scroller
244
+ is not displaying arrows, this is the amount by which the thumb overlaps
245
+ the end cap.
246
+
247
+ @type Number
248
+ @default 11
249
+ */
250
+ buttonOverlap: 11,
251
+
252
+ /**
253
+ The minimium length that the thumb will be, regardless of how much content
254
+ is in the scroll view.
255
+
256
+ @type Number
257
+ @default 20
258
+ */
259
+ minimumThumbLength: 20,
260
+
261
+ // ..........................................................
262
+ // SCROLLER DIMENSION COMPUTED PROPERTIES
263
+ //
264
+
265
+ /** @private
266
+ Returns the total length of the track in which the thumb sits.
267
+
268
+ The length of the track is the height or width of the scroller, less the
269
+ cap length and the button length. This property is used to calculate the
270
+ position of the thumb relative to the view.
271
+
272
+ @property
273
+ */
274
+ trackLength: function () {
275
+ return this.get('scrollerLength') -
276
+ (this.get('capLength') - this.get('capOverlap')) - // Subtract the size of the top/left cap
277
+ (this.get('buttonLength') - this.get('buttonOverlap')); // Subtract the size of the scroll buttons,
278
+ // or the end cap if they are not shown.
279
+ }.property('scrollerLength', 'capLength', 'capOverlap', 'buttonLength', 'buttonOverlap').cacheable(),
280
+
281
+ /** @private
282
+ Returns the height of the view if this is a vertical scroller or the width
283
+ of the view if this is a horizontal scroller. This is used when scrolling
284
+ up and down by page, as well as in various layout calculations.
285
+
286
+ @type Number
287
+ */
288
+ scrollerLength: function () {
289
+ var frame = this.get('frame'),
290
+ layoutDirection = this.get('layoutDirection');
291
+
292
+ return layoutDirection === SC.LAYOUT_VERTICAL ? frame.height :
293
+ layoutDirection === SC.LAYOUT_HORIZONTAL ? frame.width : 0;
294
+ }.property('frame').cacheable(),
295
+
296
+ /** @private
297
+ The total length of the thumb. The size of the thumb is the
298
+ length of the track times the content proportion.
299
+
300
+ @property
301
+ */
302
+ thumbLength: function () {
303
+ var length = Math.floor(this.get('trackLength') * this.get('proportion'));
304
+
305
+ return Math.max(isNaN(length) ? 0 : length, this.get('minimumThumbLength'));
306
+ }.property('trackLength', 'proportion', 'minimumThumbLength').cacheable(),
307
+
308
+ /** @private
309
+ The position of the thumb in the track.
310
+
311
+ @type Number
312
+ @isReadOnly
313
+ */
314
+ thumbPosition: function () {
315
+ var position = (this.get('displayValue') / this.get('maximum')) *
316
+ (this.get('trackLength') - this.get('thumbLength')) +
317
+ this.get('capLength') - this.get('capOverlap'); // account for the top / left cap
318
+ return Math.floor(isNaN(position) ? 0 : position);
319
+ }.property('displayValue', 'maximum', 'trackLength', 'thumbLength', 'capLength', 'capOverlap').cacheable(),
320
+
321
+ /** @private
322
+ YES if the maximum value exceeds the frame size of the scroller. This
323
+ will hide the thumb and buttons.
324
+
325
+ @type Boolean
326
+ @isReadOnly
327
+ */
328
+ controlsHidden: function () {
329
+ return this.get('proportion') >= 1;
330
+ }.property('proportion').cacheable()
331
+
332
+ });
@@ -0,0 +1,236 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ sc_require('views/core_scroll');
9
+ sc_require('views/desktop/scroller');
10
+
11
+ /** @class
12
+ Implements a desktop scroll view using mouse events.
13
+
14
+ This class uses native scroll events, inverting the control
15
+ of `horizontalScrollOffset` and `verticalScrollOffset` to
16
+ properly proxy the scroll offset values to and from SC.
17
+
18
+ When you set these, SC gets notified _after_ the scroll
19
+ offset gets set in the DOM.
20
+
21
+ Important Events:
22
+
23
+ - contentView frame size changes (to autoshow/hide scrollbar- adjust scrollbar size)
24
+ - horizontalScrollOffset change
25
+ - verticalScrollOffsetChanges
26
+
27
+ @extends SC.View
28
+ @since SproutCore 1.6
29
+ */
30
+ SC.DesktopScrollView = SC.CoreScrollView.extend(
31
+ /** @scope SC.DesktopScrollView.prototype */{
32
+
33
+ /** @private
34
+ Adjust scrollers immediately.
35
+ */
36
+ init: function () {
37
+ SC.platform.propertyDidChange('scrollbarSize'); // invalidate the cache.
38
+ this.set('nativeScrollbarThickness', SC.platform.get('scrollbarSize'));
39
+ return sc_super();
40
+ },
41
+
42
+ /**
43
+ @type SC.CoreScrollerView
44
+ @default SC.DesktopScrollerView
45
+ */
46
+ horizontalScrollerView: SC.DesktopScrollerView,
47
+
48
+ /**
49
+ @type SC.CoreScrollerView
50
+ @default SC.DesktopScrollerView
51
+ */
52
+ verticalScrollerView: SC.DesktopScrollerView,
53
+
54
+ /**
55
+ Dynamically compute the renderDelegate name off of
56
+ the property `wantsNativeScrollbars`, which will flip
57
+ the render delegate between custom scrollbars and
58
+ native ones.
59
+ @field
60
+ @type String
61
+ @default scrollRenderDelegate
62
+ */
63
+ renderDelegateName: function () {
64
+ return this.get('wantsNativeScrollbars') ? 'nativeScrollRenderDelegate' : 'scrollRenderDelegate';
65
+ }.property('wantsNativeScrollbars').cacheable(),
66
+
67
+ /**
68
+ @type Array
69
+ @default ['canScrollVertical', 'canScrollHorizontal', 'nativeScrollbarThickness']
70
+ */
71
+ displayProperties: ['canScrollVertical', 'canScrollHorizontal', 'nativeScrollbarThickness'],
72
+
73
+ /**
74
+ The current horizontal scroll offset.
75
+ Changing this value will update both the `contentView`
76
+ and the horizontal scroller, if there is one.
77
+
78
+ @field
79
+ @type Number
80
+ @default 0
81
+ */
82
+ horizontalScrollOffset: function (key, value) {
83
+ if (arguments.length === 2) {
84
+ var minOffset = this.minimumHorizontalScrollOffset(),
85
+ maxOffset = this.get('maximumHorizontalScrollOffset'),
86
+ layer = this.getPath('containerView.layer'),
87
+ offset = Math.max(minOffset, Math.min(maxOffset, value));
88
+
89
+ this._scroll_horizontalScrollOffset = offset;
90
+ if (layer && layer.scrollLeft !== offset) {
91
+ layer.scrollLeft = offset;
92
+ }
93
+ }
94
+
95
+ return this._scroll_horizontalScrollOffset || 0;
96
+ }.property().cacheable(),
97
+
98
+ /**
99
+ The current vertical scroll offset.
100
+ Changing this value will update both the `contentView`
101
+ and the vertical scroller, if there is one.
102
+
103
+ @field
104
+ @type Number
105
+ @default 0
106
+ */
107
+ verticalScrollOffset: function (key, value) {
108
+ if (arguments.length === 2) {
109
+ var minOffset = this.get('minimumVerticalScrollOffset'),
110
+ maxOffset = this.get('maximumVerticalScrollOffset'),
111
+ layer = this.getPath('containerView.layer'),
112
+ offset = Math.max(minOffset, Math.min(maxOffset, value));
113
+
114
+ this._scroll_verticalScrollOffset = offset;
115
+ if (layer && layer.scrollTop !== offset) {
116
+ layer.scrollTop = offset;
117
+ }
118
+ }
119
+
120
+ return this._scroll_verticalScrollOffset || 0;
121
+ }.property().cacheable(),
122
+
123
+ /**
124
+ The minimum interval between scroll event before
125
+ it signals that scrolling is "done".
126
+
127
+ @type Number
128
+ @default 100
129
+ */
130
+ debounceInterval: 100,
131
+
132
+ // ..........................................................
133
+ // SCROLL WHEEL SUPPORT
134
+ //
135
+
136
+ containerView: SC.ContainerView.extend({
137
+
138
+ classNames: ['sc-scroll-container-view'],
139
+
140
+ wheelEvent: function () {
141
+ // Firefox emits different mousewheel events than other browsers
142
+ return SC.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel';
143
+ }.property().cacheable(),
144
+
145
+ /** @private
146
+ Remove the "scroll" event handler for the layer.
147
+ */
148
+ willDestroyLayer: function () {
149
+ SC.Event.remove(this.get('layer'), 'scroll', this, this.scroll);
150
+ SC.Event.remove(this.get('layer'), this.get('wheelEvent'), this, this._scdsv_scrollDebounce);
151
+ },
152
+
153
+ /** @private
154
+ Attach the "scroll" event handler for the layer.
155
+ */
156
+ didCreateLayer: function () {
157
+ SC.Event.add(this.get('layer'), 'scroll', this, this.scroll);
158
+ SC.Event.add(this.get('layer'), this.get('wheelEvent'), this, this._scdsv_scrollDebounce);
159
+ this.get('parentView').displayDidChange();
160
+ },
161
+
162
+ _scdsv_scrollDebounce: function (evt) {
163
+ var self = this;
164
+
165
+ if (this._debounce != null) {
166
+ this._debounce.invalidate();
167
+ this._debounce = null;
168
+ } else {
169
+ var layer = this.get('layer'),
170
+ scrollTop = layer.scrollTop,
171
+ scrollLeft = layer.scrollLeft;
172
+ this.get('parentView').willScroll(this.get('parentView'));
173
+ }
174
+
175
+ this._debounce = this.invokeLater(function() {
176
+ self._scdsv_scrollDidFinish();
177
+ }, this.getPath('parentView.debounceInterval'));
178
+ },
179
+
180
+ _scdsv_scrollDidFinish: function () {
181
+ var layer = this.get('layer'),
182
+ scrollTop = layer.scrollTop,
183
+ scrollLeft = layer.scrollLeft;
184
+ this.get('parentView').didScroll(this.get('parentView'));
185
+ this._debounce = null;
186
+ },
187
+
188
+ /** @private
189
+ Notify the container that the scroll offsets have changed.
190
+ */
191
+ scroll: function (evt) {
192
+ var layer = this.get('layer'),
193
+ scrollTop = layer.scrollTop,
194
+ scrollLeft = layer.scrollLeft,
195
+ parentView = this.get('parentView');
196
+
197
+ // I'm using `verticalScrollOffset` and `horizontalScrollOffset`
198
+ // as proxies for the the actual scroll offsets.
199
+
200
+ // Since we know what the offsets are (we got the event), this
201
+ // needs to set the cached value, and let properties know that
202
+ // the offset changed.
203
+ if (parentView._scroll_verticalScrollOffset !== scrollTop) {
204
+ parentView.propertyWillChange('verticalScrollOffset');
205
+ parentView._scroll_verticalScrollOffset = scrollTop;
206
+ parentView.propertyDidChange('verticalScrollOffset');
207
+ }
208
+
209
+ if (parentView._scroll_horizontalScrollOffset !== scrollLeft) {
210
+ parentView.propertyWillChange('horizontalScrollOffset');
211
+ parentView._scroll_horizontalScrollOffset = scrollLeft;
212
+ parentView.propertyDidChange('horizontalScrollOffset');
213
+ }
214
+
215
+ return parentView.get('canScrollHorizontal') || parentView.get('canScrollVertical');
216
+ }
217
+ }),
218
+
219
+ /**
220
+ The native scrollbar thickness.
221
+ @type Number
222
+ @default 15
223
+ */
224
+ nativeScrollbarThickness: 15,
225
+
226
+ /** @private
227
+ Check to see if the native scrollbarSize changed due to scaling on the part
228
+ of the browser.
229
+ */
230
+ viewDidResize: function () {
231
+ SC.platform.propertyDidChange('scrollbarSize'); // invalidate the cache.
232
+ this.set('nativeScrollbarThickness', SC.platform.get('scrollbarSize'));
233
+ return sc_super();
234
+ }
235
+
236
+ });