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.
- data/CHANGELOG +21 -0
- data/Gemfile +5 -0
- data/Rakefile +26 -13
- data/VERSION.yml +2 -2
- data/lib/Buildfile +43 -4
- data/lib/buildtasks/build.rake +10 -0
- data/lib/buildtasks/helpers/file_rule.rb +22 -0
- data/lib/buildtasks/helpers/file_rule_list.rb +137 -0
- data/lib/buildtasks/manifest.rake +133 -122
- data/lib/frameworks/sproutcore/CHANGELOG.md +69 -2
- data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +28 -22
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +9 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +18 -13
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +80 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +84 -116
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +8 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +157 -157
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +10 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +106 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +18 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +71 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/attribute_bindings_test.js +38 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +47 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +18 -18
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +42 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +26 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +15 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +108 -108
- data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +26 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +4 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +6 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +26 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +97 -96
- data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +17 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +7 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +12 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +23 -14
- data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +5 -1
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +28 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +235 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +363 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +250 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +92 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +25 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +33 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +76 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +50 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +143 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +258 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +1164 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +332 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +236 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +347 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +15 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +10 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +804 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +133 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +3 -3
- data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/video.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +29 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
- data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
- data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/segmented.css +1 -1
- data/lib/gen/app/templates/apps/@target_name@/Buildfile +3 -5
- data/lib/gen/app/templates/apps/@target_name@/resources/_theme.css +18 -0
- data/lib/gen/project/templates/@filename@/Buildfile +2 -2
- data/lib/sproutcore.rb +30 -5
- data/lib/sproutcore/builders.rb +1 -0
- data/lib/sproutcore/builders/chance_file.rb +9 -16
- data/lib/sproutcore/builders/html.rb +2 -1
- data/lib/sproutcore/builders/minify.rb +4 -35
- data/lib/sproutcore/builders/module.rb +38 -1
- data/lib/sproutcore/builders/split.rb +63 -0
- data/lib/sproutcore/builders/strings.rb +7 -1
- data/lib/sproutcore/helpers.rb +1 -1
- data/lib/sproutcore/helpers/css_split.rb +190 -0
- data/lib/sproutcore/helpers/entry_sorter.rb +2 -0
- data/lib/sproutcore/helpers/minifier.rb +40 -16
- data/lib/sproutcore/helpers/static_helper.rb +35 -17
- data/lib/sproutcore/models/manifest.rb +26 -0
- data/lib/sproutcore/models/target.rb +12 -1
- data/lib/sproutcore/rack.rb +1 -0
- data/lib/sproutcore/rack/proxy.rb +244 -225
- data/lib/sproutcore/rack/restrict_ip.rb +67 -0
- data/lib/sproutcore/rack/service.rb +8 -2
- data/lib/sproutcore/tools.rb +102 -46
- data/lib/sproutcore/tools/build.rb +91 -43
- data/lib/sproutcore/tools/gen.rb +2 -3
- data/lib/sproutcore/tools/manifest.rb +22 -16
- data/lib/sproutcore/tools/server.rb +21 -0
- data/spec/buildtasks/helpers/accept_list +22 -0
- data/spec/buildtasks/helpers/accept_list.rb +128 -0
- data/spec/buildtasks/helpers/list.json +11 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_2x_spec.rb +1 -39
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +0 -38
- data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +4 -4
- data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +2 -2
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_indirect_spec.rb +7 -16
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_spec.rb +7 -17
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +11 -6
- data/spec/fixtures/builder_tests/Buildfile +2 -1
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_module/core.js +0 -0
- data/spec/lib/builders/module_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/sproutcore.gemspec +4 -9
- data/vendor/chance/lib/chance.rb +25 -6
- data/vendor/chance/lib/chance/factory.rb +45 -0
- data/vendor/chance/lib/chance/instance.rb +173 -28
- data/vendor/chance/lib/chance/instance/data_url.rb +0 -29
- data/vendor/chance/lib/chance/instance/slicing.rb +57 -4
- data/vendor/chance/lib/chance/instance/spriting.rb +112 -21
- data/vendor/chance/lib/chance/parser.rb +80 -52
- data/vendor/sproutcore/SCCompiler.jar +0 -0
- data/vendor/sproutcore/lib/args4j-2.0.12.jar +0 -0
- data/vendor/sproutcore/lib/yuicompressor-2.4.2.jar +0 -0
- metadata +84 -25
data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js
ADDED
@@ -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
|
+
});
|