sproutcore 1.11.0.rc2 → 1.11.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG +10 -0
  3. data/VERSION.yml +1 -1
  4. data/lib/frameworks/sproutcore/CHANGELOG.md +114 -1
  5. data/lib/frameworks/sproutcore/apps/showcase/views/views_item_view.js +1 -7
  6. data/lib/frameworks/sproutcore/apps/showcase/views/views_list_view.js +9 -9
  7. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +167 -5
  8. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +24 -8
  9. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/stack_layout.js +737 -0
  10. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +0 -6
  11. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +11 -7
  12. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane_statechart.js +7 -11
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/child_view_layout_protocol.js +8 -3
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/observable_protocol.js +9 -6
  15. data/lib/frameworks/sproutcore/frameworks/{desktop/protocols/responder.js → core_foundation/protocols/responder_protocol.js} +83 -17
  16. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/{sparse_array_delegate.js → sparse_array_delegate_protocol.js} +11 -7
  17. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/view_transition_protocol.js +11 -6
  18. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +2 -2
  19. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/page.js +0 -22
  20. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +61 -56
  21. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/main_pane.js +2 -2
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +3 -3
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/animation.js +63 -39
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/border_frame_test.js +28 -28
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createLayer.js +10 -4
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +102 -1
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +4 -4
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +103 -103
  29. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/replaceAllChildren_test.js +1 -1
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view.js +77 -1
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view_states_test.js +18 -17
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +42 -49
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +5 -6
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/enabled.js +16 -5
  35. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +241 -102
  36. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +1 -4
  37. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +0 -11
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +993 -610
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +3 -2
  40. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +6 -11
  41. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +94 -27
  42. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +133 -53
  43. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +30 -35
  44. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +3 -2
  45. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +73 -29
  46. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/conflictedStoreKeys_test.js +156 -0
  47. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +61 -37
  48. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +2 -2
  49. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +68 -39
  50. data/lib/frameworks/sproutcore/frameworks/designer/tests/coders/page.js +1 -2
  51. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +8 -6
  52. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +80 -14
  53. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
  54. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/{drag_data_source.js → drag_data_source_protocol.js} +16 -10
  55. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/{drag_source.js → drag_source_protocol.js} +28 -26
  56. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/{drop_target.js → drop_target_protocol.js} +73 -75
  57. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -4
  58. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +39 -23
  59. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +120 -97
  60. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowSizeForContentIndex.js +26 -25
  61. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +3 -3
  62. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +5 -0
  63. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/{dividers.js → dividers_test.js} +38 -38
  64. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +29 -14
  65. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +2 -1
  66. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +13 -18
  67. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +41 -35
  68. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +14 -14
  69. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +41 -26
  70. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +2 -12
  71. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap.js +2 -2
  72. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +14 -10
  73. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gesturable.js +104 -63
  74. data/lib/frameworks/sproutcore/frameworks/foundation/protocols/swap_transition_protocol.js +9 -4
  75. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/auto_mixin_tests.js +1 -2
  76. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/auto_resize_test.js +33 -33
  77. data/lib/frameworks/sproutcore/frameworks/foundation/tests/transitions/view_transitions_test.js +5 -5
  78. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/methods.js +0 -4
  79. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/transition_test.js +0 -4
  80. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +0 -2
  81. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +12 -8
  82. data/lib/frameworks/sproutcore/frameworks/media/resources/silence.mp3 +0 -0
  83. data/lib/frameworks/sproutcore/frameworks/media/tests/audio.js +69 -0
  84. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +1 -0
  85. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
  86. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +11 -4
  87. data/lib/frameworks/sproutcore/frameworks/runtime/protocols/mixin_protocol.js +150 -0
  88. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +447 -137
  89. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +9 -15
  90. data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +19 -17
  91. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +188 -16
  92. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +1 -1
  93. data/lib/frameworks/sproutcore/frameworks/template_view/panes/template.js +0 -3
  94. data/lib/frameworks/sproutcore/frameworks/template_view/tests/panes/template.js +0 -17
  95. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/collection.js +43 -26
  96. data/lib/frameworks/sproutcore/frameworks/template_view/views/bindable_span.js +9 -2
  97. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list.css +0 -1
  98. data/lib/frameworks/sproutcore/themes/ace/resources/scroll/scroll.css +3 -0
  99. data/sproutcore.gemspec +3 -3
  100. metadata +19 -17
  101. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/horizontal_stack_layout.js +0 -465
  102. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/vertical_stack_layout.js +0 -472
  103. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build.js +0 -87
  104. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +0 -89
@@ -30,10 +30,10 @@ SC.TapGesture = SC.Gesture.extend(
30
30
 
31
31
  /** @private */
32
32
  _tapCount: null,
33
-
33
+
34
34
  /** @private */
35
35
  _candidateTouch: null,
36
-
36
+
37
37
  /** @private */
38
38
  _eventTimer: null,
39
39
 
@@ -199,13 +199,13 @@ SC.AutoResize = {
199
199
  @private
200
200
  Begins observing the auto resize field.
201
201
  */
202
+ // @if (debug)
202
203
  initMixin: function() {
203
- // @if (debug)
204
204
  if (!this.get('supportsAutoResize')) {
205
205
  throw new Error("View `%@` does not support automatic resize. See documentation for SC.AutoResize".fmt(this));
206
206
  }
207
- // @endif
208
207
  },
208
+ // @endif
209
209
 
210
210
  /**
211
211
  If this property is provided, all views that share the same value for this property will be resized as a batch for increased performance.
@@ -228,8 +228,10 @@ SC.AutoResize = {
228
228
  SC.AutoResizeManager.scheduleMeasurementForView(this, batchResizeId);
229
229
  }.observes('isVisibleInWindow', 'shouldMeasureSize', 'autoResizeText', 'batchResizeId'),
230
230
 
231
+ /** @private */
231
232
  _lastMeasuredText: null,
232
233
 
234
+ /** @private */
233
235
  _cachedMetrics: function(key, value) {
234
236
  if(!this.get('shouldCacheSizes')) return;
235
237
 
@@ -250,11 +252,12 @@ SC.AutoResize = {
250
252
  @param batch For internal use during batch resizing.
251
253
  */
252
254
  measureSize: function(batch) {
253
- var metrics, layer = this.get('autoResizeLayer'), autoResizeText = this.get('autoResizeText'),
255
+ var metrics, layer = this.get('autoResizeLayer'),
256
+ autoResizeText = this.get('autoResizeText'),
254
257
  ignoreEscape = !this.get('escapeHTML'),
255
258
  batchResizeId = this.get('batchResizeId'),
256
- cachedMetrics = this.get('_cachedMetrics'),
257
- maxFontSize = this.get('maxFontSize');
259
+ cachedMetrics = this.get('_cachedMetrics');
260
+ // maxFontSize = this.get('maxFontSize');
258
261
 
259
262
  if (!layer) return;
260
263
 
@@ -353,7 +356,8 @@ SC.AutoResize = {
353
356
  // the frame will be truncated
354
357
  width = frame.width - 1, height = frame.height - 1,
355
358
  measured = this.get('measuredSize'),
356
- mWidth = measured.width, mHeight = measured.height;
359
+ mWidth = measured.width, mHeight = measured.height,
360
+ actual;
357
361
 
358
362
  // figure out and apply padding to the width/height
359
363
  if(SC.typeOf(padding) === SC.T_NUMBER) {
@@ -382,7 +386,6 @@ SC.AutoResize = {
382
386
  var xProportion = width / mWidth, yProportion = height / mHeight,
383
387
 
384
388
  guestimate = Math.floor(maxFontSize * Math.min(xProportion, yProportion)),
385
- actual,
386
389
 
387
390
  classNames = this.get('classNames'),
388
391
  ignoreEscape = !this.get('escapeHTML'),
@@ -472,7 +475,7 @@ SC.AutoResize = {
472
475
 
473
476
  TODO: consider making the measurement state a formal SC.View state
474
477
  */
475
- _transitionIn: function (original) {
478
+ _transitionIn: function (original, inPlace) {
476
479
  // In order to allow views to measure and adjust themselves on append, we
477
480
  // can't transition until after the measurement is done.
478
481
  var preTransitionOpacity = this.get('layout').opacity || 1;
@@ -480,7 +483,7 @@ SC.AutoResize = {
480
483
  this.adjust('opacity', 0);
481
484
  this.invokeNext(function () {
482
485
  this.adjust('opacity', preTransitionOpacity);
483
- original();
486
+ original(inPlace);
484
487
  });
485
488
  }.enhance()
486
489
 
@@ -515,7 +518,7 @@ SC.AutoResizeManager = {
515
518
  scheduleMeasurementForView: function(view) {
516
519
  this.measurementQueue.add(view);
517
520
 
518
- SC.RunLoop.currentRunLoop.invokeLast(this.doBatchResize);
521
+ SC.RunLoop.currentRunLoop.invokeOnce(this.doBatchResize);
519
522
  },
520
523
 
521
524
  /**
@@ -587,4 +590,5 @@ SC.AutoResizeManager = {
587
590
  }
588
591
  }
589
592
  }
593
+
590
594
  };
@@ -7,132 +7,173 @@
7
7
 
8
8
  /**
9
9
  @namespace
10
-
10
+
11
11
  You can mix in SC.Gesturable to your views to add some support for recognizing
12
12
  gestures.
13
-
13
+
14
14
  SproutCore views have built-in touch events. However, sometimes you may want
15
15
  to recognize gestures like tap, pinch, swipe, etc. This becomes tedious if you
16
16
  need to do this often, and more so if you need to check for multiple possible
17
17
  gestures on the same view.
18
-
18
+
19
19
  SC.Gesturable allows you to define a collection of gestures (SC.Gesture objects)
20
20
  that your view should recognize. When a gesture is recognized, methods will be
21
21
  called on the view:
22
-
23
- - [gestureName](gesture, args...): called when the gesture has occurred. This is
22
+
23
+ - [gestureName](gesture, args...): called when the gesture has occurred. This is
24
24
  useful for event-style gestures, where you aren't interested in when it starts or
25
25
  ends, but just that it has occurred. SC.SwipeGesture triggers this after the
26
26
  swipe has moved a minimum amount—40px by default.
27
- - [gestureName]Start(gesture, args...): called when the gesture is first recognized.
28
- For instance, a swipe gesture may be recognized after the finger has moved a
27
+ - [gestureName]Start(gesture, args...): called when the gesture is first recognized.
28
+ For instance, a swipe gesture may be recognized after the finger has moved a
29
29
  minimum distance in a horizontal.
30
- - [gestureName]Changed(gesture, args...): called when some property of the gesture
31
- has changed. For instance, this may be called continuously as the user swipes as
30
+ - [gestureName]Changed(gesture, args...): called when some property of the gesture
31
+ has changed. For instance, this may be called continuously as the user swipes as
32
32
  the swipe's distance changes.
33
- - [gestureName]Cancelled(gesture, args...): called when a gesture, for one reason
34
- or another, is no longer recognized. For instance, a horizontal swipe gesture
33
+ - [gestureName]Cancelled(gesture, args...): called when a gesture, for one reason
34
+ or another, is no longer recognized. For instance, a horizontal swipe gesture
35
35
  could cancel if the user moves too far in a vertical direction.
36
36
  - [gestureName]End(gesture, args...): called when a gesture ends. A swipe would end
37
37
  when the user lifts their finger.
38
-
38
+
39
39
  Each of these methods is passed the gesture instance, in addition to any arguments
40
40
  the gesture sends for your convenience. The default swipe gesture sends an SC.Touch
41
41
  instance, the swipe direction, and the distance the swipe has moved in that direction.
42
-
42
+
43
43
  Using SC.Gesturable
44
44
  -------------------
45
-
45
+
46
46
  To make your view recognize gestures, mix in Gesturable and add items to the 'gestures'
47
47
  property:
48
-
48
+
49
49
  SC.View.extend(SC.Gesturable, {
50
50
  gestures: [SC.PinchGesture, 'mySwipeGesture'],
51
-
51
+
52
52
  // specifying as a string allows you to configure it:
53
53
  mySwipeGesture: SC.SwipeGesture.extend({
54
54
  direction: SC.SWIPE_VERTICAL,
55
55
  startDistance: 3,
56
56
  swipeDistance: 20
57
57
  }),
58
-
58
+
59
59
  // handle the swipe action
60
60
  swipe: function(touch, direction) {
61
61
  console.error("Swiped! In direction: " + direction);
62
62
  },
63
-
63
+
64
64
  swipeStart: function(touch, direction, delta) {
65
65
  console.error("Swipe started in direction: " + direction + "; dist: " + delta);
66
66
  },
67
-
67
+
68
68
  swipeChanged: function(touch, direction, delta) {
69
69
  console.error("Swipe continued in direction: " + direction + "; dist: " + delta);
70
70
  },
71
-
71
+
72
72
  swipeEnd: function(touch, direction, delta) {
73
73
  console.error("Completed swipe in direction: " + direction + "; dist: " + delta);
74
74
  }
75
-
75
+
76
76
  })
77
-
77
+
78
+ @extends SC.ObjectMixinProtocol
78
79
  */
79
80
  SC.Gesturable = {
80
81
 
81
- concatenatedProperties: ["gestures"],
82
- gestures: [],
83
-
84
82
  /**
85
- @private
86
- When SC.Gesturable initializes, any gestures on the view must be instantiated.
83
+ @type Array
84
+ @default ['gestures']
85
+ @see SC.Object#concatenatedProperties
86
+ */
87
+ concatenatedProperties: ['gestures'],
88
+
89
+ /**
90
+ The gestures that the view will support. This property must be set on the consumer of
91
+ `SC.Gesturable` before it is initialized.
92
+
93
+ These gestures should be objects that extend the `SC.Gesture` class. You can use SproutCore's
94
+ pre-built gestures or create your own. If you create your own, you can use a property name
95
+ in the list of gestures to refer to the actual gesture class, similar to how the childViews
96
+ array works. For example,
97
+
98
+ gestures: [SC.PinchGesture, 'mySwipeGesture'],
99
+
100
+ // Specifying the Gesture by property name allows you to configure it.
101
+ mySwipeGesture: SC.SwipeGesture.extend({
102
+ direction: SC.SWIPE_VERTICAL,
103
+ startDistance: 3,
104
+ swipeDistance: 20
105
+ }),
106
+
107
+ Note that `gestures` is a *concatenated property*, which means that it will not be overwritten
108
+ by subclasses. So for example, if the base class lists gestures as `[SC.PinchGesture]` and its
109
+ subclass lists gestures as `[SC.TapGesture]`, the actual gestures supported by the subclass will
110
+ be `[SC.PinchGesture, SC.TapGesture]`.
111
+
112
+ @type Array
113
+ @default null
114
+ */
115
+ gestures: null,
116
+
117
+ /**
118
+ When SC.Gesturable initializes, any gestures named on the view are instantiated.
119
+
120
+ @see SC.ObjectMixinProtocol#initMixin
87
121
  */
88
122
  initMixin: function() {
123
+ //@if(debug)
124
+ if (SC.none(this.gestures)) {
125
+ SC.error("Developer Error: When mixing in SC.Gesturable, you must define a list of gestures to use.");
126
+ }
127
+ //@endif
89
128
  this.createGestures();
90
129
  },
91
-
92
- /**
93
- @private
94
- Instantiates the gestures.
95
- */
130
+
131
+ /** @private Instantiates the gestures. */
96
132
  createGestures: function() {
97
- var gestures = this.get("gestures"), idx, len = gestures.length, g, _g = [];
133
+ var gestures = this.get("gestures"),
134
+ len = gestures.length,
135
+ instantiatedGestures = [],
136
+ idx;
98
137
 
99
138
  // loop through all gestures
100
139
  for (idx = 0; idx < len; idx++) {
140
+ var gesture;
141
+
101
142
  // get the proper gesture
102
143
  if (SC.typeOf(gestures[idx]) === SC.T_STRING) {
103
- g = this.get(gestures[idx]);
144
+ gesture = this.get(gestures[idx]);
104
145
  } else {
105
- g = gestures[idx];
146
+ gesture = gestures[idx];
106
147
  }
107
-
148
+
108
149
  // if it was not found, well, that's an error.
109
- if (!g) {
110
- throw new Error("Could not find gesture named '" + gestures[idx] + "' on view.");
150
+ if (!gesture) {
151
+ throw new Error("Developer Error: Could not find gesture named '" + gestures[idx] + "' on view.");
111
152
  }
112
-
153
+
113
154
  // if it is a class, instantiate (it really ought to be a class...)
114
- if (g.isClass) {
115
- g = g.create({
155
+ if (gesture.isClass) {
156
+ gesture = gesture.create({
116
157
  view: this
117
158
  });
118
159
  }
119
-
160
+
120
161
  // and set the gesture instance and add it to the array.
121
- if (SC.typeOf(gestures[idx]) === SC.T_STRING) this[gestures[idx]] = g;
122
- _g.push(g);
162
+ if (SC.typeOf(gestures[idx]) === SC.T_STRING) this[gestures[idx]] = gesture;
163
+ instantiatedGestures.push(gesture);
123
164
  }
124
-
125
- this.set("gestures", _g);
165
+
166
+ this.set("gestures", instantiatedGestures);
126
167
  },
127
-
168
+
128
169
  /**
129
170
  Handles touch start by handing it to the gesture recognizing code.
130
-
171
+
131
172
  If you override touchStart, you will need to call gestureTouchStart to
132
173
  give the gesture system control of the touch. You will continue to get
133
174
  events until if and when a gesture decides to take "possession" of a touch—
134
175
  at this point, you will get a [gestureName]Start event.
135
-
176
+
136
177
  You do not have to call gestureTouchStart immediately; you can call it
137
178
  at any time. This allows you to avoid passing control until _after_ you
138
179
  have determined your own touchStart, touchesDragged, and touchEnd methods
@@ -141,50 +182,50 @@ SC.Gesturable = {
141
182
  touchStart: function(touch) {
142
183
  this.gestureTouchStart(touch);
143
184
  },
144
-
185
+
145
186
  /**
146
187
  Tells the gesture recognizing code about touches moving.
147
-
188
+
148
189
  If you override touchesDragged, you will need to call gestureTouchesDragged
149
- (at least for any touches you called gestureTouchStart for in touchStart) to
190
+ (at least for any touches you called gestureTouchStart for in touchStart) to
150
191
  allow the gesture system to update.
151
192
  */
152
193
  touchesDragged: function(evt, touches) {
153
194
  this.gestureTouchesDragged(evt, touches);
154
195
  },
155
-
196
+
156
197
  /**
157
198
  Tells the gesture recognizing code about a touch ending.
158
-
199
+
159
200
  If you override touchEnd, you will need to call gestureTouchEnd
160
201
  for any touches you called touchStart for.
161
202
  */
162
203
  touchEnd: function(touch) {
163
204
  this.gestureTouchEnd(touch);
164
205
  },
165
-
206
+
166
207
  /**
167
208
  Tells the gesture recognizing system about a new touch.
168
-
209
+
169
210
  This informs all gestures that a new touch, "unassigned" to any gesture,
170
211
  has been located. Later, each gesture has an opportunity to claim the touch.
171
-
212
+
172
213
  Once they have claimed the touch, further events will go _directly_ to them—
173
214
  this view will cease receiving the touchesDragged and will not receive a touchEnd.
174
215
  */
175
216
  gestureTouchStart: function(touch) {
176
217
  touch.isInteresting = 0;
177
-
218
+
178
219
  var gestures = this.get("gestures"), idx, len = gestures.length, g;
179
220
  for (idx = 0; idx < len; idx++) {
180
221
  g = gestures[idx];
181
222
  g.unassignedTouchDidStart(touch);
182
223
  }
183
224
  },
184
-
225
+
185
226
  /**
186
227
  Tells the gesture recognition system that some touches have moved.
187
-
228
+
188
229
  This informs all gestures that these touches have changed. All such touches
189
230
  are "unassigned" because all "assigned" touches already get sent directly
190
231
  to the gesture.
@@ -196,10 +237,10 @@ SC.Gesturable = {
196
237
  g.unassignedTouchesDidChange(evt, touches);
197
238
  }
198
239
  },
199
-
240
+
200
241
  /**
201
242
  Tells the gesture recognition system that a touch have ended.
202
-
243
+
203
244
  This informs all of the gestures that the touch ended. The touch is
204
245
  an unassigned touch as, if it were assigned to a gesture, it would have
205
246
  been sent directly to the gesture, bypassing this view.
@@ -211,4 +252,4 @@ SC.Gesturable = {
211
252
  g.unassignedTouchDidEnd(touch);
212
253
  }
213
254
  }
214
- };
255
+ };
@@ -6,11 +6,16 @@
6
6
 
7
7
 
8
8
  /** @namespace
9
- This protocol defines the allowable transition plugin methods.
9
+ The `SC.SwapTransitionProtocol` protocol defines the properties and methods that you may
10
+ implement in your custom swap transition plugins. All methods are optional, but a plugin is
11
+ expected to use at least one of the methods.
10
12
 
11
- SC.ContainerView uses transition plugins to setup, execute and cleanup the
12
- swapping between views and expects the given transition plugin object
13
- to implement the methods in this protocol.
13
+ SC.ContainerView uses transition plugins to setup, execute and cleanup the swapping between views
14
+ and expects the given transition plugin object to implement the methods in this protocol.
15
+
16
+ *Note: Do not mix `SC.SwapTransitionProtocol` into your classes. As a protocol, it exists only
17
+ for reference sake. You only need define any of the properties or methods listed below in order to
18
+ use this protocol.*
14
19
  */
15
20
  SC.SwapTransitionProtocol = {
16
21
 
@@ -1,6 +1,5 @@
1
1
  // ==========================================================================
2
- // Project: Showcase
3
- // Copyright: ©2013 7x7 Software, Inc.
2
+ // Project: SproutCore
4
3
  // License: Licensed under MIT license
5
4
  // ==========================================================================
6
5
  /*globals module, test, ok, equals */
@@ -13,9 +13,11 @@ var view;
13
13
  module("SC.AutoResize", {
14
14
 
15
15
  setup: function () {
16
- view = SC.LabelView.create(SC.AutoResize, {
17
- layout: { left: 0, height: 40 },
18
- value: "The bottom line, Williams said, is that the internet is “a giant machine designed to give people what they want.” It’s not a utopia. It’s not magical. It’s simply an engine of convenience. Those who can tune that engine well — who solve basic human problems with greater speed and simplicity than those who came before — will profit immensely. Those who lose sight of basic human needs — who want to give people the next great idea — will have problems. “We often think of the internet enables you to do new things,” Williams said. “But people just want to do the same things they’ve always done.”"
16
+ SC.run(function () {
17
+ view = SC.LabelView.create(SC.AutoResize, {
18
+ layout: { left: 0, height: 40 },
19
+ value: "The bottom line, Williams said, is that the internet is “a giant machine designed to give people what they want.” It’s not a utopia. It’s not magical. It’s simply an engine of convenience. Those who can tune that engine well — who solve basic human problems with greater speed and simplicity than those who came before — will profit immensely. Those who lose sight of basic human needs — who want to give people the next great idea — will have problems. “We often think of the internet enables you to do new things,” Williams said. “But people just want to do the same things they’ve always done.”"
20
+ });
19
21
  });
20
22
  },
21
23
 
@@ -40,10 +42,10 @@ test("Resize height only.", function () {
40
42
 
41
43
  // Set the view up for height only resizing.
42
44
  // i.e. It should grow to fit the text wrapped within the width of the view.
43
- view.set('shouldResizeWidth', false);
44
- view.set('shouldResizeHeight', true);
45
-
46
45
  SC.run(function () {
46
+ view.set('shouldResizeWidth', false);
47
+ view.set('shouldResizeHeight', true);
48
+
47
49
  pane.appendChild(view);
48
50
  pane.append();
49
51
  });
@@ -101,7 +103,7 @@ test("Resize with transition plugin - conflict", function () {
101
103
 
102
104
  // Width transition plugin.
103
105
  run: function (view, options, finalLayout, finalFrame) {
104
- view.animate('width', finalFrame.width, { duration: 0.5 }, function (data) {
106
+ view.animate('width', finalFrame.width, { duration: 1 }, function (data) {
105
107
  this.didTransitionIn();
106
108
  });
107
109
  }
@@ -119,7 +121,7 @@ test("Resize with transition plugin - conflict", function () {
119
121
  ok(jqEl.width() > 10, 'width is > 10: %@'.fmt(jqEl.width()));
120
122
  ok(jqEl.width() < 3000, 'width is < 3000: %@'.fmt(jqEl.width()));
121
123
  ok(view.get('layout').width > 3000, 'layout.width is > 3000: %@'.fmt(view.get('layout').width));
122
- }, 200);
124
+ }, 250);
123
125
 
124
126
  setTimeout(function () {
125
127
  var jqEl = view.$();
@@ -132,13 +134,10 @@ test("Resize with transition plugin - conflict", function () {
132
134
  });
133
135
 
134
136
  start();
135
- }, 700);
137
+ }, 1250);
136
138
  });
137
139
 
138
-
139
140
  test("Resize with child view layout", function () {
140
- stop(700);
141
-
142
141
  var pane, view2;
143
142
 
144
143
  SC.run(function () {
@@ -147,8 +146,8 @@ test("Resize with child view layout", function () {
147
146
  layout: { top: 200, left: 0, width: 200, height: 200 },
148
147
  childViewLayout: SC.View.HORIZONTAL_STACK,
149
148
 
150
- a: SC.View.extend({
151
- layout: { width: 100 }
149
+ a: SC.LabelView.extend(SC.AutoResize, {
150
+ value: "XYZ"
152
151
  }),
153
152
 
154
153
  b: SC.View.extend({
@@ -167,23 +166,24 @@ test("Resize with child view layout", function () {
167
166
  pane.appendChild(view2);
168
167
  });
169
168
 
170
- setTimeout(function () {
171
- ok(view.get('layout').width > 2000, 'width is > 2000');
172
- equals(view.get('layout').left, 150, 'left is');
173
- ok(view2.get('layout').left > 2000, 'left: %@ is > 2000'.fmt(view2.get('layout').left));
169
+ var childViews = pane.get('childViews'),
170
+ viewA = childViews.objectAt(0),
171
+ viewB = childViews.objectAt(1);
174
172
 
175
- pane.destroy();
176
- pane.remove();
173
+ ok(view.get('layout').width > 2000, 'width is > 2000');
174
+ equals(viewB.get('layout').left, viewA.get('frame').width, 'second view left is');
175
+ equals(view.get('layout').left, viewA.get('frame').width + 50, 'third view left is');
176
+ ok(view2.get('layout').left > 2000, 'left: %@ is > 2000'.fmt(view2.get('layout').left));
177
177
 
178
- start();
179
- }, 500);
178
+ pane.destroy();
179
+ pane.remove();
180
180
  });
181
181
 
182
182
  /**
183
- For a TextFieldView where we set it to only resize its height every time its value changes
183
+ For a TextFieldView where we set it to only resize its height every time its value changes
184
184
  we get the textareas width and set its max-width to this if no autoResizeLayer has been set.
185
185
 
186
- This test checks that every-time the value changes the max-width we set doesn't change the
186
+ This test checks that every-time the value changes the max-width we set doesn't change the
187
187
  textarea width (i.e. takes padding into account when measuring).
188
188
  */
189
189
  test("Resize height only for textarea where textarea has padding.", function () {
@@ -218,10 +218,10 @@ test("Resize height only for textarea where textarea has padding.", function ()
218
218
  SC.run(function () {
219
219
  view.$('textarea').css({
220
220
  'padding': '10px',
221
- '-webkit-box-sizing': 'border-box',
221
+ '-webkit-box-sizing': 'border-box',
222
222
  '-moz-box-sizing': 'border-box',
223
- 'box-sizing': 'border-box'
224
- })
223
+ 'box-sizing': 'border-box'
224
+ });
225
225
  });
226
226
 
227
227
  // now the css is applied measure the textareas width
@@ -236,7 +236,7 @@ test("Resize height only for textarea where textarea has padding.", function ()
236
236
  setTimeout(function () {
237
237
  // check the frame and textarea have the expected dimensions
238
238
  ok(view.get('frame').width == 200, 'frame width is 200');
239
- equals(origWidth, view.$('textarea').outerWidth(), 'textarea width has not changed since update of value')
239
+ equals(origWidth, view.$('textarea').outerWidth(), 'textarea width has not changed since update of value');
240
240
 
241
241
  pane.destroy();
242
242
  pane.remove();
@@ -280,10 +280,10 @@ test("Resize text only for input where input has padding.", function () {
280
280
  SC.run(function () {
281
281
  view.$('input').css({
282
282
  'padding': '10px',
283
- '-webkit-box-sizing': 'border-box',
283
+ '-webkit-box-sizing': 'border-box',
284
284
  '-moz-box-sizing': 'border-box',
285
- 'box-sizing': 'border-box'
286
- })
285
+ 'box-sizing': 'border-box'
286
+ });
287
287
  });
288
288
 
289
289
  // now the css is applied measure the input fields width
@@ -298,11 +298,11 @@ test("Resize text only for input where input has padding.", function () {
298
298
  setTimeout(function () {
299
299
  // check the frame and input field have the expected dimensions
300
300
  ok(view.get('frame').width == 200, 'frame width is 200');
301
- equals(origWidth, view.$('input').outerWidth(), 'input field width has not changed since update of value')
301
+ equals(origWidth, view.$('input').outerWidth(), 'input field width has not changed since update of value');
302
302
 
303
303
  pane.destroy();
304
304
  pane.remove();
305
305
 
306
306
  start();
307
307
  }, 500);
308
- })
308
+ });