sproutcore 1.6.0.1-java → 1.7.1.beta-java

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 (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
+ });