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