sproutcore 1.6.0.1 → 1.7.1.beta
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/keyboard.js +26 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
- 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/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/builders.rb +1 -0
- 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/helpers.rb +1 -1
- data/lib/sproutcore/models/manifest.rb +26 -0
- data/lib/sproutcore/models/target.rb +12 -1
- 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/rack.rb +1 -0
- 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/lib/sproutcore/tools.rb +102 -46
- data/lib/sproutcore.rb +30 -5
- 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/factory.rb +45 -0
- 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/instance.rb +173 -28
- data/vendor/chance/lib/chance/parser.rb +80 -52
- data/vendor/chance/lib/chance.rb +25 -6
- 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 +97 -38
|
@@ -0,0 +1,347 @@
|
|
|
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_scroller');
|
|
9
|
+
|
|
10
|
+
/** @class
|
|
11
|
+
Implements a custom desktop-like scroller view that handles
|
|
12
|
+
your basic scrollbar events:
|
|
13
|
+
|
|
14
|
+
- Arrow buttons for incremental scrolling in either direction.
|
|
15
|
+
- Clicking in the track to incrementally jump to a location.
|
|
16
|
+
- CTL+Click to jump immediately to a location.
|
|
17
|
+
- A draggable scroll thumb.
|
|
18
|
+
|
|
19
|
+
@extends SC.CoreScrollerView
|
|
20
|
+
@since SproutCore 1.6
|
|
21
|
+
*/
|
|
22
|
+
SC.DesktopScrollerView = SC.CoreScrollerView.extend(
|
|
23
|
+
/** @scope SC.DesktopScrollerView.prototype */{
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
@type String
|
|
27
|
+
@default 'desktopScrollerRenderDelegate'
|
|
28
|
+
*/
|
|
29
|
+
renderDelegateName: 'desktopScrollerRenderDelegate',
|
|
30
|
+
|
|
31
|
+
// ..........................................................
|
|
32
|
+
// MOUSE EVENTS
|
|
33
|
+
//
|
|
34
|
+
|
|
35
|
+
/** @private
|
|
36
|
+
Returns the value for a position within the scroller's frame.
|
|
37
|
+
*/
|
|
38
|
+
valueForPosition: function (pos) {
|
|
39
|
+
return ((pos - (this.get('capLength') - this.get('capOverlap'))) /
|
|
40
|
+
(this.get('trackLength') - this.get('thumbLength'))) * this.get('maximum');
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
/** @private
|
|
44
|
+
Handles mouse down events and adjusts the value property depending where
|
|
45
|
+
the user clicked.
|
|
46
|
+
|
|
47
|
+
If the control is disabled, we ignore all mouse input.
|
|
48
|
+
|
|
49
|
+
If the user clicks the thumb, we note the position of the mouse event but
|
|
50
|
+
do not take further action until they begin to drag.
|
|
51
|
+
|
|
52
|
+
If the user clicks the track, we adjust the value a page at a time, unless
|
|
53
|
+
alt is pressed, in which case we scroll to that position.
|
|
54
|
+
|
|
55
|
+
If the user clicks the buttons, we adjust the value by a fixed amount, unless
|
|
56
|
+
alt is pressed, in which case we adjust by a page.
|
|
57
|
+
|
|
58
|
+
If the user clicks and holds on either the track or buttons, those actions
|
|
59
|
+
are repeated until they release the mouse button.
|
|
60
|
+
|
|
61
|
+
@param evt {SC.Event} the mousedown event
|
|
62
|
+
*/
|
|
63
|
+
mouseDown: function (evt) {
|
|
64
|
+
if (!this.get('isEnabled')) return NO;
|
|
65
|
+
|
|
66
|
+
var target = evt.target,
|
|
67
|
+
thumbPosition = this.get('thumbPosition'),
|
|
68
|
+
value, clickLocation, clickOffset,
|
|
69
|
+
scrollerLength = this.get('scrollerLength');
|
|
70
|
+
|
|
71
|
+
// Determine the subcontrol that was clicked
|
|
72
|
+
if (target.className.indexOf('thumb') >= 0) {
|
|
73
|
+
// Convert the mouseDown coordinates to the view's coordinates
|
|
74
|
+
clickLocation = this.convertFrameFromView({ x: evt.pageX,
|
|
75
|
+
y: evt.pageY });
|
|
76
|
+
|
|
77
|
+
clickLocation.x -= thumbPosition;
|
|
78
|
+
clickLocation.y -= thumbPosition;
|
|
79
|
+
|
|
80
|
+
// Store the starting state so we know how much to adjust the
|
|
81
|
+
// thumb when the user drags
|
|
82
|
+
this._thumbDragging = YES;
|
|
83
|
+
this._thumbOffset = clickLocation;
|
|
84
|
+
this._mouseDownLocation = { x: evt.pageX,
|
|
85
|
+
y: evt.pageY };
|
|
86
|
+
this._thumbPositionAtDragStart = this.get('thumbPosition');
|
|
87
|
+
this._valueAtDragStart = this.get("value");
|
|
88
|
+
|
|
89
|
+
// User clicked the up/left button; decrement the value by a fixed amount or page size
|
|
90
|
+
} else if (target.className.indexOf('button-top') >= 0) {
|
|
91
|
+
this.decrementProperty('value', 30);
|
|
92
|
+
this.makeButtonActive('.button-top');
|
|
93
|
+
|
|
94
|
+
// start a timer that will continue to fire until mouseUp is called
|
|
95
|
+
this.startMouseDownTimer('scrollUp');
|
|
96
|
+
this._isScrollingUp = YES;
|
|
97
|
+
|
|
98
|
+
// User clicked the down/right button; increment the value by a fixed amount
|
|
99
|
+
} else if (target.className.indexOf('button-bottom') >= 0) {
|
|
100
|
+
this.incrementProperty('value', 30);
|
|
101
|
+
this.makeButtonActive('.button-bottom');
|
|
102
|
+
|
|
103
|
+
// start a timer that will continue to fire until mouseUp is called
|
|
104
|
+
this.startMouseDownTimer('scrollDown');
|
|
105
|
+
this._isScrollingDown = YES;
|
|
106
|
+
|
|
107
|
+
// User clicked in the track
|
|
108
|
+
} else {
|
|
109
|
+
var scrollToClick = this.get("shouldScrollToClick"),
|
|
110
|
+
trackLength = this.get('trackLength'),
|
|
111
|
+
thumbLength = this.get('thumbLength'),
|
|
112
|
+
frame = this.convertFrameFromView({ x: evt.pageX, y: evt.pageY }),
|
|
113
|
+
mousePosition;
|
|
114
|
+
|
|
115
|
+
if (evt.altKey) scrollToClick = !scrollToClick;
|
|
116
|
+
|
|
117
|
+
switch (this.get('layoutDirection')) {
|
|
118
|
+
case SC.LAYOUT_VERTICAL:
|
|
119
|
+
this._mouseDownLocation = mousePosition = frame.y;
|
|
120
|
+
break;
|
|
121
|
+
case SC.LAYOUT_HORIZONTAL:
|
|
122
|
+
this._mouseDownLocation = mousePosition = frame.x;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (scrollToClick) {
|
|
127
|
+
this.set('value', this.valueForPosition(mousePosition - (thumbLength / 2)));
|
|
128
|
+
|
|
129
|
+
// and start a normal mouse down
|
|
130
|
+
thumbPosition = this.get('thumbPosition');
|
|
131
|
+
|
|
132
|
+
this._thumbDragging = YES;
|
|
133
|
+
this._thumbOffset = { x: frame.x - thumbPosition,
|
|
134
|
+
y: frame.y - thumbPosition };
|
|
135
|
+
this._mouseDownLocation = { x: evt.pageX,
|
|
136
|
+
y: evt.pageY };
|
|
137
|
+
this._thumbPositionAtDragStart = thumbPosition;
|
|
138
|
+
this._valueAtDragStart = this.get("value");
|
|
139
|
+
|
|
140
|
+
// Move the thumb up or down a page depending on whether the click
|
|
141
|
+
// was above or below the thumb
|
|
142
|
+
} else if (mousePosition < thumbPosition) {
|
|
143
|
+
this.decrementProperty('value', scrollerLength);
|
|
144
|
+
this.startMouseDownTimer('page');
|
|
145
|
+
|
|
146
|
+
} else {
|
|
147
|
+
this.incrementProperty('value', scrollerLength);
|
|
148
|
+
this.startMouseDownTimer('page');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return YES;
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
/** @private
|
|
156
|
+
When the user releases the mouse button, remove any active
|
|
157
|
+
state from the button controls, and cancel any outstanding
|
|
158
|
+
timers.
|
|
159
|
+
|
|
160
|
+
@param evt {SC.Event} the mousedown event
|
|
161
|
+
*/
|
|
162
|
+
mouseUp: function (evt) {
|
|
163
|
+
var active = this._scs_buttonActive,
|
|
164
|
+
ret = NO, timer;
|
|
165
|
+
|
|
166
|
+
// If we have an element that was set as active in mouseDown,
|
|
167
|
+
// remove its active state
|
|
168
|
+
if (active) {
|
|
169
|
+
active.removeClass('active');
|
|
170
|
+
ret = YES;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Stop firing repeating events after mouseup
|
|
174
|
+
timer = this._mouseDownTimer;
|
|
175
|
+
if (timer) {
|
|
176
|
+
timer.invalidate();
|
|
177
|
+
this._mouseDownTimer = null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
this._thumbDragging = NO;
|
|
181
|
+
this._isScrollingDown = NO;
|
|
182
|
+
this._isScrollingUp = NO;
|
|
183
|
+
|
|
184
|
+
return ret;
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
/** @private
|
|
188
|
+
If the user began the drag on the thumb, we calculate the difference
|
|
189
|
+
between the mouse position at click and where it is now. We then
|
|
190
|
+
offset the thumb by that amount, within the bounds of the track.
|
|
191
|
+
|
|
192
|
+
If the user began scrolling up/down using the buttons, this will track
|
|
193
|
+
what component they are currently over, changing the scroll direction.
|
|
194
|
+
|
|
195
|
+
@param evt {SC.Event} the mousedragged event
|
|
196
|
+
*/
|
|
197
|
+
mouseDragged: function (evt) {
|
|
198
|
+
var value, length, delta, thumbPosition,
|
|
199
|
+
target = evt.target,
|
|
200
|
+
thumbPositionAtDragStart = this._thumbPositionAtDragStart,
|
|
201
|
+
isScrollingUp = this._isScrollingUp,
|
|
202
|
+
isScrollingDown = this._isScrollingDown,
|
|
203
|
+
active = this._scs_buttonActive,
|
|
204
|
+
timer;
|
|
205
|
+
|
|
206
|
+
// Only move the thumb if the user clicked on the thumb during mouseDown
|
|
207
|
+
if (this._thumbDragging) {
|
|
208
|
+
switch (this.get('layoutDirection')) {
|
|
209
|
+
case SC.LAYOUT_VERTICAL:
|
|
210
|
+
delta = (evt.pageY - this._mouseDownLocation.y);
|
|
211
|
+
break;
|
|
212
|
+
case SC.LAYOUT_HORIZONTAL:
|
|
213
|
+
delta = (evt.pageX - this._mouseDownLocation.x);
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
thumbPosition = thumbPositionAtDragStart + delta;
|
|
218
|
+
length = this.get('trackLength') - this.get('thumbLength');
|
|
219
|
+
this.set('value', Math.round( (thumbPosition/length) * this.get('maximum')));
|
|
220
|
+
|
|
221
|
+
} else if (isScrollingUp || isScrollingDown) {
|
|
222
|
+
var nowScrollingUp = NO, nowScrollingDown = NO;
|
|
223
|
+
|
|
224
|
+
var topButtonRect = this.$('.button-top')[0].getBoundingClientRect();
|
|
225
|
+
var bottomButtonRect = this.$('.button-bottom')[0].getBoundingClientRect();
|
|
226
|
+
|
|
227
|
+
switch (this.get('layoutDirection')) {
|
|
228
|
+
case SC.LAYOUT_VERTICAL:
|
|
229
|
+
nowScrollingUp = (evt.clientY < topButtonRect.bottom);
|
|
230
|
+
break;
|
|
231
|
+
case SC.LAYOUT_HORIZONTAL:
|
|
232
|
+
nowScrollingUp = (evt.clientX < topButtonRect.right);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
nowScrollingDown = !nowScrollingUp;
|
|
236
|
+
|
|
237
|
+
if ((nowScrollingUp || nowScrollingDown) && nowScrollingUp !== isScrollingUp) {
|
|
238
|
+
// If we have an element that was set as active in mouseDown,
|
|
239
|
+
// remove its active state
|
|
240
|
+
if (active) active.removeClass('active');
|
|
241
|
+
|
|
242
|
+
// Stop firing repeating events after mouseup
|
|
243
|
+
this._mouseDownTimerAction = nowScrollingUp ? "scrollUp" : "scrollDown";
|
|
244
|
+
|
|
245
|
+
if (nowScrollingUp) {
|
|
246
|
+
this.makeButtonActive('.button-top');
|
|
247
|
+
} else if (nowScrollingDown) {
|
|
248
|
+
this.makeButtonActive('.button-bottom');
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
this._isScrollingUp = nowScrollingUp;
|
|
252
|
+
this._isScrollingDown = nowScrollingDown;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return YES;
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
mouseWheel: function (evt) {
|
|
260
|
+
var el = this.getPath('parentView.containerView.layer'),
|
|
261
|
+
rawEvent = evt.originalEvent;
|
|
262
|
+
|
|
263
|
+
if (el && rawEvent) {
|
|
264
|
+
try {
|
|
265
|
+
if (SC.typeOf(el.fireEvent) === SC.T_FUNCTION) { // IE
|
|
266
|
+
el.fireEvent(rawEvent.type, rawEvent);
|
|
267
|
+
} else { // W3C
|
|
268
|
+
el.dispatchEvent(rawEvent);
|
|
269
|
+
}
|
|
270
|
+
} catch (x) {
|
|
271
|
+
// Can't dispatch the event; give up.
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
|
|
276
|
+
/** @private
|
|
277
|
+
Starts a timer that fires after 300ms. This is called when the user
|
|
278
|
+
clicks a button or inside the track to move a page at a time. If they
|
|
279
|
+
continue holding the mouse button down, we want to repeat that action
|
|
280
|
+
after a small delay. This timer will be invalidated in mouseUp.
|
|
281
|
+
|
|
282
|
+
Specify "immediate" as YES if it should not wait.
|
|
283
|
+
*/
|
|
284
|
+
startMouseDownTimer: function (action, immediate) {
|
|
285
|
+
this._mouseDownTimerAction = action;
|
|
286
|
+
this._mouseDownTimer = SC.Timer.schedule({
|
|
287
|
+
target: this,
|
|
288
|
+
action: this.mouseDownTimerDidFire,
|
|
289
|
+
interval: immediate ? 0 : 300
|
|
290
|
+
});
|
|
291
|
+
},
|
|
292
|
+
|
|
293
|
+
/** @private
|
|
294
|
+
Called by the mousedown timer. This method determines the initial
|
|
295
|
+
user action and repeats it until the timer is invalidated in mouseUp.
|
|
296
|
+
*/
|
|
297
|
+
mouseDownTimerDidFire: function () {
|
|
298
|
+
var scrollerLength = this.get('scrollerLength'),
|
|
299
|
+
mouseLocation = SC.device.get('mouseLocation'),
|
|
300
|
+
thumbPosition = this.get('thumbPosition'),
|
|
301
|
+
thumbLength = this.get('thumbLength'),
|
|
302
|
+
timerInterval = 50;
|
|
303
|
+
|
|
304
|
+
switch (this.get('layoutDirection')) {
|
|
305
|
+
case SC.LAYOUT_VERTICAL:
|
|
306
|
+
mouseLocation = this.convertFrameFromView(mouseLocation).y;
|
|
307
|
+
break;
|
|
308
|
+
case SC.LAYOUT_HORIZONTAL:
|
|
309
|
+
mouseLocation = this.convertFrameFromView(mouseLocation).x;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
switch (this._mouseDownTimerAction) {
|
|
314
|
+
case 'scrollDown':
|
|
315
|
+
this.incrementProperty('value', 30);
|
|
316
|
+
break;
|
|
317
|
+
case 'scrollUp':
|
|
318
|
+
this.decrementProperty('value', 30);
|
|
319
|
+
break;
|
|
320
|
+
case 'page':
|
|
321
|
+
timerInterval = 150;
|
|
322
|
+
if (mouseLocation < thumbPosition) {
|
|
323
|
+
this.decrementProperty('value', scrollerLength);
|
|
324
|
+
} else if (mouseLocation > thumbPosition+thumbLength) {
|
|
325
|
+
this.incrementProperty('value', scrollerLength);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
this._mouseDownTimer = SC.Timer.schedule({
|
|
330
|
+
target: this,
|
|
331
|
+
action: this.mouseDownTimerDidFire,
|
|
332
|
+
interval: timerInterval
|
|
333
|
+
});
|
|
334
|
+
},
|
|
335
|
+
|
|
336
|
+
/** @private
|
|
337
|
+
Given a selector, finds the corresponding DOM element and adds
|
|
338
|
+
the 'active' class name. Also stores the returned element so that
|
|
339
|
+
the 'active' class name can be removed during mouseup.
|
|
340
|
+
|
|
341
|
+
@param {String} the selector to find
|
|
342
|
+
*/
|
|
343
|
+
makeButtonActive: function (selector) {
|
|
344
|
+
this._scs_buttonActive = this.$(selector).addClass('active');
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// ==========================================================================
|
|
2
|
+
// Project: SproutCore - JavaScript Application Framework
|
|
3
|
+
// Copyright: ©2006-2011 Strobe Inc. and contributors.
|
|
4
|
+
// License: Licensed under MIT license (see license.js)
|
|
5
|
+
// ==========================================================================
|
|
6
|
+
|
|
7
|
+
sc_require('views/desktop/scroll');
|
|
8
|
+
sc_require('views/touch/scroll');
|
|
9
|
+
|
|
10
|
+
SC.ScrollView = SC.platform.touch ? SC.TouchScrollView : SC.DesktopScrollView;
|
|
11
|
+
|
|
12
|
+
// Spoofed browsers should use TouchScrollView.
|
|
13
|
+
if (SC.browser && SC.platform && SC.browser.mobileSafari && !SC.platform.touch) {
|
|
14
|
+
SC.ScrollView = SC.TouchScrollView;
|
|
15
|
+
}
|
data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// ==========================================================================
|
|
2
|
+
// Project: SproutCore - JavaScript Application Framework
|
|
3
|
+
// Copyright: ©2006-2011 Strobe Inc. and contributors.
|
|
4
|
+
// License: Licensed under MIT license (see license.js)
|
|
5
|
+
// ==========================================================================
|
|
6
|
+
|
|
7
|
+
sc_require('views/desktop/scroller');
|
|
8
|
+
|
|
9
|
+
// Legacy ScrollerView === DesktopScrollerView
|
|
10
|
+
SC.ScrollerView = SC.DesktopScrollerView;
|