sproutcore 1.5.0.rc.1 → 1.5.0.rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. data/CHANGELOG +4 -0
  2. data/VERSION.yml +1 -1
  3. data/lib/frameworks/sproutcore/Buildfile +9 -4
  4. data/lib/frameworks/sproutcore/README.md +1 -0
  5. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/QuickLook/Preview.pdf +0 -0
  6. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/QuickLook/Thumbnail.tiff +0 -0
  7. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/data.plist +0 -0
  8. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image10.png +0 -0
  9. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image11.png +0 -0
  10. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image13.png +0 -0
  11. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image15.png +0 -0
  12. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image16.png +0 -0
  13. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image17.png +0 -0
  14. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image18.png +0 -0
  15. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image19.png +0 -0
  16. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image22.tiff +0 -0
  17. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image23.png +0 -0
  18. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image24.png +0 -0
  19. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image25.png +0 -0
  20. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image30.png +0 -0
  21. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image31.png +0 -0
  22. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image8.png +0 -0
  23. data/lib/frameworks/sproutcore/design/{TestRunner_Design.gaffle → TestRunner_Design.graffle}/image9.png +0 -0
  24. data/lib/frameworks/sproutcore/frameworks/animation/core.js +23 -25
  25. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +160 -0
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +73 -82
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/core.js +1 -3
  28. data/lib/frameworks/sproutcore/frameworks/{handlebars/extensions → core_foundation/ext/handlebars}/bind.js +110 -7
  29. data/lib/frameworks/sproutcore/frameworks/{handlebars/extensions → core_foundation/ext/handlebars}/collection.js +10 -7
  30. data/lib/frameworks/sproutcore/frameworks/{handlebars/extensions → core_foundation/ext/handlebars}/localization.js +1 -1
  31. data/lib/frameworks/sproutcore/frameworks/{handlebars/extensions → core_foundation/ext/handlebars}/view.js +4 -2
  32. data/lib/frameworks/sproutcore/frameworks/{handlebars/extensions.js → core_foundation/ext/handlebars.js} +0 -57
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +1 -3
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +11 -0
  35. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +1 -3
  36. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +2 -4
  37. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/application.js +14 -16
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/builder.js +29 -37
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/datetime.js +0 -0
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +71 -19
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +3 -7
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/page.js +5 -7
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +1 -3
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +4 -0
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/timer.js +21 -27
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils.js +3 -5
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +3 -3
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/single_enumerable_case.js +1 -1
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/sparse_array.js +1 -1
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +93 -1
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +1 -1
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/convertLayouts.js +13 -11
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layer.js +2 -6
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +4 -4
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/theme.js +2 -0
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view.js +4 -4
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template.js +6 -2
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template_collection.js +87 -32
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +21 -25
  60. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +15 -19
  61. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +114 -167
  62. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +4 -4
  63. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +4 -6
  64. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +2 -4
  65. data/lib/frameworks/sproutcore/frameworks/datastore/models/fetched_attribute.js +7 -7
  66. data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +18 -20
  67. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +74 -72
  68. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +36 -29
  69. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +2 -2
  70. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +97 -78
  71. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +117 -97
  72. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +13 -13
  73. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +111 -108
  74. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +231 -198
  75. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +146 -145
  76. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +21 -21
  77. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +49 -50
  78. data/lib/frameworks/sproutcore/frameworks/datetime/{system → frameworks/core/system}/datetime.js +122 -171
  79. data/lib/frameworks/sproutcore/frameworks/datetime/{tests → frameworks/core/tests}/system/datetime.js +0 -0
  80. data/lib/frameworks/sproutcore/frameworks/datetime/{resources → frameworks/localized/resources}/strings.js +0 -0
  81. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +91 -0
  82. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +18 -2
  83. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/border.js +23 -16
  84. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +56 -45
  85. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_group.js +5 -2
  86. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +21 -19
  87. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +82 -77
  88. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/navigation_builder.js +18 -12
  89. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +29 -17
  90. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +148 -107
  91. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +31 -16
  92. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +16 -13
  93. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +38 -17
  94. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +37 -25
  95. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +247 -144
  96. data/lib/frameworks/sproutcore/frameworks/desktop/panes/select_button.js +155 -100
  97. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +39 -17
  98. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +9 -6
  99. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +18 -22
  100. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +27 -17
  101. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +77 -44
  102. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +68 -33
  103. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +168 -110
  104. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +37 -5
  105. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +187 -123
  106. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +73 -49
  107. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +34 -9
  108. data/lib/frameworks/sproutcore/frameworks/desktop/views/file.js +51 -14
  109. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +38 -8
  110. data/lib/frameworks/sproutcore/frameworks/desktop/views/image_button.js +15 -9
  111. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +54 -34
  112. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +113 -42
  113. data/lib/frameworks/sproutcore/frameworks/desktop/views/master_detail.js +84 -28
  114. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +67 -51
  115. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +122 -35
  116. data/lib/frameworks/sproutcore/frameworks/desktop/views/navigation.js +40 -16
  117. data/lib/frameworks/sproutcore/frameworks/desktop/views/navigation_bar.js +28 -18
  118. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +27 -31
  119. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +118 -68
  120. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +117 -61
  121. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +23 -16
  122. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +241 -77
  123. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +134 -69
  124. data/lib/frameworks/sproutcore/frameworks/desktop/views/segment.js +107 -25
  125. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +125 -48
  126. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +165 -69
  127. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +73 -24
  128. data/lib/frameworks/sproutcore/frameworks/desktop/views/separator.js +19 -5
  129. data/lib/frameworks/sproutcore/frameworks/desktop/views/source_list.js +16 -4
  130. data/lib/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +14 -7
  131. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +43 -37
  132. data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +8 -1
  133. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +14 -3
  134. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +16 -2
  135. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +99 -0
  136. data/lib/frameworks/sproutcore/frameworks/desktop/views/thumb.js +13 -1
  137. data/lib/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +58 -8
  138. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +34 -18
  139. data/lib/frameworks/sproutcore/frameworks/desktop/views/well.js +25 -9
  140. data/lib/frameworks/sproutcore/frameworks/desktop/views/workspace.js +70 -36
  141. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +10 -5
  142. data/lib/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +28 -17
  143. data/lib/frameworks/sproutcore/frameworks/foundation/delegates/inline_text_field.js +41 -43
  144. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/pinch.js +42 -4
  145. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/swipe.js +94 -4
  146. data/lib/frameworks/sproutcore/frameworks/foundation/gestures/tap.js +41 -1
  147. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_mixin.js +2 -0
  148. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +18 -9
  149. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +7 -5
  150. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +7 -8
  151. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +34 -24
  152. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/control.js +48 -18
  153. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +1 -0
  154. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/misc.js +1 -2
  155. data/lib/frameworks/sproutcore/frameworks/foundation/tasks/preload_bundle.js +1 -1
  156. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js +0 -11
  157. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
  158. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +8 -0
  159. data/lib/frameworks/sproutcore/frameworks/qunit/README.md +24 -0
  160. data/lib/frameworks/sproutcore/frameworks/qunit/package.json +21 -0
  161. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.css +215 -0
  162. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.js +1442 -0
  163. data/lib/frameworks/sproutcore/frameworks/qunit/test/headless.html +24 -0
  164. data/lib/frameworks/sproutcore/frameworks/qunit/test/index.html +18 -0
  165. data/lib/frameworks/sproutcore/frameworks/qunit/test/logs.html +17 -0
  166. data/lib/frameworks/sproutcore/frameworks/qunit/test/logs.js +150 -0
  167. data/lib/frameworks/sproutcore/frameworks/qunit/test/same.js +1421 -0
  168. data/lib/frameworks/sproutcore/frameworks/qunit/test/test.js +314 -0
  169. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +1 -1
  170. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +369 -60
  171. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +2 -405
  172. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +3 -9
  173. data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +50 -45
  174. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +20 -1
  175. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +0 -9
  176. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/guidFor.js +1 -1
  177. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +36 -14
  178. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable.js +0 -34
  179. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable_observers.js +50 -61
  180. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +2 -2
  181. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +1 -1
  182. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/registerDependentKeys.js +45 -1
  183. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/propertyChanges.js +1 -1
  184. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/bindings.js +5 -0
  185. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/enhance.js +1 -1
  186. data/lib/frameworks/sproutcore/frameworks/testing/core.js +3 -0
  187. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +0 -1
  188. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +0 -1
  189. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +1 -1
  190. data/vendor/chance/lib/chance/instance.rb +8 -6
  191. metadata +41 -31
  192. data/lib/frameworks/sproutcore/frameworks/testing/jquery.js +0 -3559
  193. data/lib/frameworks/sproutcore/frameworks/testing/qunit.js +0 -827
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ *SproutCore 1.5.0.rc.2 (April 11, 2011)*
2
+
3
+ * Fixed a compatibility issue with Windows environments
4
+
1
5
  *SproutCore 1.5.0.rc.1 (April 1, 2011)*
2
6
 
3
7
  * Made it possible to share index.html across multiple languages vs. duplicating it for each.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 1
3
3
  :minor: 5
4
- :patch: 0.rc.1
4
+ :patch: 0.rc.2
@@ -27,12 +27,14 @@ end
27
27
  # CORE FRAMEWORKS
28
28
  config :bootstrap, :required => [], :use_modules => false
29
29
 
30
- config :jquery, :required => []
30
+ config :jquery, :required => [], :test_required => [], :debug_required => []
31
31
  config :handlebars, :required => []
32
32
  config :runtime, :required => [:jquery]
33
- config :datetime, :required => [:runtime]
33
+ config :'datetime/core', :required => [:runtime]
34
+ config :datetime, :required => [:'datetime/core']
34
35
  config :core_foundation, :required => [:runtime, :handlebars]
35
- config :foundation, :required => [:core_foundation, :datetime]
36
+ config :'datetime/localized', :required => [:core_foundation]
37
+ config :foundation, :required => [:core_foundation, :datetime, :'datetime/localized']
36
38
  config :datastore, :required => [:runtime, :datetime]
37
39
  config :desktop, :required => [:foundation]
38
40
  config :media, :required => [:desktop]
@@ -54,9 +56,12 @@ config :mini, :required => [:runtime, :datastore]
54
56
  config :animation, :required => :foundation
55
57
  config :forms, :required => :desktop
56
58
 
59
+ config :qunit, :required => []
60
+ config :testing, :required => [:jquery], :test_required => [], :debug_required => []
61
+
57
62
  # SPECIAL FRAMEWORKS AND THEMES
58
63
  # These do not require any of the built-in SproutCore frameworks
59
- %w(testing debug legacy_theme empty_theme).each do |target_name|
64
+ %w(debug legacy_theme empty_theme).each do |target_name|
60
65
  config target_name,
61
66
  :required => [], :test_required => [], :debug_required => []
62
67
  end
@@ -33,6 +33,7 @@ code and ideas:
33
33
  - Erich Ocean
34
34
  - Evin Grano
35
35
  - Geoffrey Donaldson
36
+ - James A. Rosen
36
37
  - James Austin
37
38
  - Jason Ketterman
38
39
  - Jonathan Lewis
@@ -8,31 +8,29 @@
8
8
  /*globals */
9
9
 
10
10
  /** @namespace
11
- A simple mixin called Animatable is provided. What does it do?
12
- It makes CSS transitions for you, and if they aren't available,
13
- implements them in JavaScript.
14
-
15
- Animatable things:
16
- - layout. You can animate any layout property, even centerX and centerY
17
- - opacity.
18
- - display, in a way. All animating display does is delay setting display:none
19
- until <em>after</em> the transition duration has passed. This allows you
20
- to set display:none after fading out. If mixing with CSS transitions, you will
21
- need to set the delay a tad longer to accomodate any delays in beginning the
22
- transition.
23
-
24
- @class SC.Animatable
25
- @example Example Usage:
26
- {{{
27
- aView: SC.LabelView.design(SC.Animatable, {
28
- transitions: {
29
- left: {duration: .25},
30
- top: .25, // only possible during design; otherwise you must use long form.
31
- width: {duration: .25, timing: SC.Animatable.TRANSITION_EASE_IN_OUT }
32
- }
33
- })
34
- }}}
35
- @extends SC.Object
11
+ A simple mixin called Animatable is provided. What does it do?
12
+ It makes CSS transitions for you, and if they aren't available,
13
+ implements them in JavaScript.
14
+
15
+ ## Animatable things:
16
+
17
+ - layout. You can animate any layout property, even centerX and centerY
18
+ - opacity.
19
+ - display, in a way. All animating display does is delay setting display:none
20
+ until <em>after</em> the transition duration has passed. This allows you
21
+ to set display:none after fading out. If mixing with CSS transitions, you will
22
+ need to set the delay a tad longer to accomodate any delays in beginning the
23
+ transition.
24
+
25
+ ## Example Usage:
26
+
27
+ aView: SC.LabelView.design(SC.Animatable, {
28
+ transitions: {
29
+ left: {duration: .25},
30
+ top: .25, // only possible during design; otherwise you must use long form.
31
+ width: {duration: .25, timing: SC.Animatable.TRANSITION_EASE_IN_OUT }
32
+ }
33
+ })
36
34
  */
37
35
  SC.Animatable = {
38
36
  /** @scope SC.Animatable.prototype */
@@ -17,49 +17,209 @@ SC._detectBrowser = function(userAgent, language) {
17
17
  version = browser.version = (userAgent.match( /.*(?:rv|chrome|webkit|opera|ie)[\/: ](.+?)([ \);]|$)/ ) || [])[1];
18
18
  webkitVersion = (userAgent.match( /webkit\/(.+?) / ) || [])[1];
19
19
 
20
+ /**
21
+ @name SC.browser.isWindows
22
+ @type Boolean
23
+ */
20
24
  browser.windows = browser.isWindows = !!/windows/.test(userAgent);
25
+
26
+ /**
27
+ @name SC.browser.isMac
28
+ @type Boolean
29
+ */
21
30
  browser.mac = browser.isMac = !!/macintosh/.test(userAgent) || (/mac os x/.test(userAgent) && !/like mac os x/.test(userAgent));
31
+
32
+ /**
33
+ @name SC.browser.isiPhone
34
+ @type Boolean
35
+ */
22
36
  browser.iPhone = browser.isiPhone = !!/iphone/.test(userAgent);
37
+
38
+ /**
39
+ @name SC.browser.isiPod
40
+ @type Boolean
41
+ */
23
42
  browser.iPod = browser.isiPod = !!/ipod/.test(userAgent);
43
+
44
+ /**
45
+ @name SC.browser.isiPad
46
+ @type Boolean
47
+ */
24
48
  browser.iPad = browser.isiPad = !!/ipad/.test(userAgent);
49
+
50
+ /**
51
+ @name SC.browser.isiOS
52
+ @type Boolean
53
+ */
25
54
  browser.iOS = browser.isiOS = browser.iPhone || browser.iPod || browser.iPad;
55
+
56
+ /**
57
+ @name SC.browser.isAndroid
58
+ @type Boolean
59
+ */
26
60
  browser.android = browser.isAndroid = !!/android/.test(userAgent);
27
61
 
62
+ /**
63
+ @name SC.browser.opera
64
+ @type String
65
+ */
28
66
  browser.opera = /opera/.test(userAgent) ? version : 0;
67
+
68
+ /**
69
+ @name SC.browser.isOpera
70
+ @type Boolean
71
+ */
29
72
  browser.isOpera = !!browser.opera;
30
73
 
74
+ /**
75
+ @name SC.browser.msie
76
+ @type String
77
+ */
31
78
  browser.msie = /msie/.test(userAgent) && !browser.opera ? version : 0;
79
+
80
+ /**
81
+ @name SC.browser.isIE
82
+ @type Boolean
83
+ */
32
84
  browser.isIE = !!browser.msie;
85
+
86
+ /**
87
+ @name SC.browser.isIE8OrLower
88
+ @type Boolean
89
+ */
33
90
  browser.isIE8OrLower = !!(browser.msie && parseInt(browser.msie, 10) <= 8);
34
91
 
92
+ /**
93
+ @name SC.browser.mozilla
94
+ @type String
95
+ */
35
96
  browser.mozilla = /mozilla/.test(userAgent) && !/(compatible|webkit|msie)/.test(userAgent) ? version : 0;
97
+
98
+ /**
99
+ @name SC.browser.isMozilla
100
+ @type Boolean
101
+ */
36
102
  browser.isMozilla = !!browser.mozilla;
37
103
 
104
+ /**
105
+ @name SC.browser.webkit
106
+ @type String
107
+ */
38
108
  browser.webkit = /webkit/.test(userAgent) ? webkitVersion : 0;
109
+
110
+ /**
111
+ @name SC.browser.isWebkit
112
+ @type Boolean
113
+ */
39
114
  browser.isWebkit = !!browser.webkit;
40
115
 
116
+ /**
117
+ @name SC.browser.chrome
118
+ @type String
119
+ */
41
120
  browser.chrome = /chrome/.test(userAgent) ? version: 0;
121
+
122
+ /**
123
+ @name SC.browser.isChrome
124
+ @type Boolean
125
+ */
42
126
  browser.isChrome = !!browser.chrome;
43
127
 
128
+ /**
129
+ @name SC.browser.mobileSafari
130
+ @type String
131
+ */
44
132
  browser.mobileSafari = /apple.*mobile.*safari/.test(userAgent) && browser.iOS ? webkitVersion : 0;
133
+
134
+ /**
135
+ @name SC.browser.isMobileSafari
136
+ @type Boolean
137
+ */
45
138
  browser.isMobileSafari = !!browser.mobileSafari;
46
139
 
140
+ /**
141
+ @name SC.browser.iPadSafari
142
+ @type String
143
+ */
47
144
  browser.iPadSafari = browser.iPad && browser.isMobileSafari ? webkitVersion : 0;
145
+
146
+ /**
147
+ @name SC.browser.isiPadSafari
148
+ @type Boolean
149
+ */
48
150
  browser.isiPadSafari = !!browser.iPadSafari;
49
151
 
152
+ /**
153
+ @name SC.browser.iPhoneSafari
154
+ @type String
155
+ */
50
156
  browser.iPhoneSafari = browser.iPhone && browser.isMobileSafari ? webkitVersion : 0;
157
+
158
+ /**
159
+ @name SC.browser.isiPhoneSafari
160
+ @type Boolean
161
+ */
51
162
  browser.isiPhoneSafari = !!browser.iphoneSafari;
52
163
 
164
+ /**
165
+ @name SC.browser.iPodSafari
166
+ @type String
167
+ */
53
168
  browser.iPodSafari = browser.iPod && browser.isMobileSafari ? webkitVersion : 0;
169
+
170
+ /**
171
+ @name SC.browser.isiPodSafari
172
+ @type Boolean
173
+ */
54
174
  browser.isiPodSafari = !!browser.iPodSafari;
55
175
 
176
+ /**
177
+ @name SC.browser.safari
178
+ @type String
179
+ */
56
180
  browser.safari = browser.webkit && !browser.chrome && !browser.iOS && !browser.android ? webkitVersion : 0;
181
+
182
+ /**
183
+ @name SC.browser.isSafari
184
+ @type Boolean
185
+ */
57
186
  browser.isSafari = !!browser.safari;
58
187
 
188
+ /**
189
+ @name SC.browser.language
190
+ @type String
191
+ */
59
192
  browser.language = language.split('-', 1)[0];
60
193
 
194
+ /**
195
+ Possible values:
196
+
197
+ - 'msie'
198
+ - 'mozilla'
199
+ - 'chrome'
200
+ - 'safari'
201
+ - 'opera'
202
+ - 'mobile-safari'
203
+ - 'unknown'
204
+
205
+ @name SC.browser.current
206
+ @type String
207
+ @default 'unknown'
208
+ */
61
209
  browser.current = browser.msie ? 'msie' : browser.mozilla ? 'mozilla' : browser.chrome ? 'chrome' : browser.safari ? 'safari' : browser.opera ? 'opera' : browser.mobileSafari ? 'mobile-safari' : 'unknown';
62
210
  return browser;
63
211
  };
64
212
 
213
+
214
+ /** @class
215
+
216
+ Contains information about the browser environment that SproutCore
217
+ is running in. String properties, such as `SC.browser.webkit` or
218
+ `SC.browser.msie`, will have a value that represents the browser build
219
+ number if that browser is being used. Otherwise, they will have a
220
+ falsey value. For convenience, Boolean counterparts for all of the
221
+ versioned properties are provided.
222
+
223
+ @since SproutCore 1.0
224
+ */
65
225
  SC.browser = SC._detectBrowser();
@@ -293,7 +293,8 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
293
293
  }
294
294
  }
295
295
 
296
- if (content) content.replace(start, amt, objects);
296
+ if (content) { content.replace(start, amt, objects); }
297
+
297
298
  for(i=0, objsLen = objsToDestroy.length; i<objsLen; i++){
298
299
 
299
300
  objsToDestroy[i].destroy();
@@ -392,6 +393,27 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
392
393
  return (this._scac_cached = content.toArray().sort(func)) ;
393
394
  },
394
395
 
396
+ propertyWillChange: function(key) {
397
+ if (key === 'content') {
398
+ this.arrayContentWillChange(0, this.get('length'), 0);
399
+ } else {
400
+ return sc_super();
401
+ }
402
+ },
403
+
404
+ _scac_arrayContentWillChange: function(start, removed, added) {
405
+ this.arrayContentWillChange(start, removed, added);
406
+ var removedObjects = this.slice(start, start+removed);
407
+ this.teardownEnumerablePropertyChains(removedObjects);
408
+ },
409
+
410
+ _scac_arrayContentDidChange: function(start, removed, added) {
411
+ this.arrayContentDidChange(start, removed, added);
412
+ var addedObjects = this.slice(start, start+added);
413
+ this.setupEnumerablePropertyChains(addedObjects);
414
+ this.updateSelectionAfterContentChange();
415
+ },
416
+
395
417
  /** @private
396
418
  Whenever content changes, setup and teardown observers on the content
397
419
  as needed.
@@ -400,81 +422,74 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
400
422
 
401
423
  this._scac_cached = NO; // invalidate observable content
402
424
 
403
- var cur = this.get('content'),
404
- orders = !!this.get('orderBy'),
405
- last = this._scac_content,
406
- oldlen = this._scac_length || 0,
407
- func = this._scac_rangeDidChange,
408
- efunc = this._scac_enumerableDidChange,
409
- cfunc = this._scac_enumerableContentDidChange,
410
- sfunc = this._scac_contentStatusDidChange,
411
- ro = this._scac_rangeObserver,
425
+ var content = this.get('content'),
426
+ orders = !!this.get('orderBy'),
427
+ lastContent = this._scac_content,
428
+ oldlen = this._scac_length || 0,
429
+ didChange = this._scac_arrayContentDidChange,
430
+ willChange = this._scac_arrayContentWillChange,
431
+ sfunc = this._scac_contentStatusDidChange,
432
+ efunc = this._scac_enumerableDidChange,
412
433
  newlen;
413
434
 
414
- if (last === cur) { return this; } // nothing to do
435
+ if (content === lastContent) { return this; } // nothing to do
415
436
 
416
437
  // teardown old observer
417
- if (last) {
418
- if (last.isSCArray) {
419
- if (ro) { last.removeRangeObserver(ro); }
420
- last.removeEnumerableObserver(this, cfunc);
438
+ if (lastContent) {
439
+ if (lastContent.isSCArray) {
440
+ lastContent.removeArrayObservers({
441
+ target: this,
442
+ didChange: didChange,
443
+ willChange: willChange
444
+ });
445
+ } else if (lastContent.isEnumerable) {
446
+ lastContent.removeObserver('[]', this, efunc);
421
447
  }
422
- else if (last.isEnumerable) { last.removeObserver('[]', this, efunc); }
423
- last.removeObserver('status', this, sfunc);
424
- }
425
448
 
426
- ro = null;
449
+ lastContent.removeObserver('status', this, sfunc);
450
+ }
427
451
 
428
452
  // save new cached values
429
453
  this._scac_cached = NO;
430
- this._scac_content = cur ;
454
+ this._scac_content = content ;
431
455
 
432
- // setup new observers
456
+ // setup new observer
433
457
  // also, calculate new length. do it manually instead of using
434
458
  // get(length) because we want to avoid computed an ordered array.
435
- if (cur) {
436
- if (!orders && cur.isSCArray) { ro = cur.addRangeObserver(null, this, func); }
437
- if (cur.isSCArray) { cur.addEnumerableObserver(this, cfunc); }
438
- else if (cur.isEnumerable) { cur.addObserver('[]', this, efunc); }
439
- newlen = cur.isEnumerable ? cur.get('length') : 1;
440
- cur.addObserver('status', this, sfunc);
459
+ if (content) {
460
+ // Content is an enumerable, so listen for changes to its
461
+ // content, and get its length.
462
+ if (content.isSCArray) {
463
+ content.addArrayObservers({
464
+ target: this,
465
+ didChange: didChange,
466
+ willChange: willChange
467
+ });
468
+
469
+ newlen = content.get('length');
470
+ } else if (content.isEnumerable) {
471
+ content.addObserver('[]', this, efunc);
472
+ newlen = content.get('length');
473
+ } else {
474
+ // Assume that someone has set a non-enumerable as the content, and
475
+ // treat it as the sole member of an array.
476
+ newlen = 1;
477
+ }
441
478
 
479
+ // Observer for changes to the status property, in case this is an
480
+ // SC.Record or SC.RecordArray.
481
+ content.addObserver('status', this, sfunc);
442
482
  } else {
443
- newlen = SC.none(cur) ? 0 : 1;
483
+ newlen = SC.none(content) ? 0 : 1;
444
484
  }
445
485
 
446
- this._scac_rangeObserver = ro;
447
-
448
486
  // finally, notify enumerable content has changed.
449
487
  this._scac_length = newlen;
450
488
  this._scac_contentStatusDidChange();
451
- this.enumerableContentDidChange(0, newlen, newlen - oldlen, this, last||[]);
489
+ this.arrayContentDidChange(0, 0, newlen);
452
490
  this.updateSelectionAfterContentChange();
453
491
  }.observes('content'),
454
492
 
455
- /** @private
456
- Whenever array content changes, need to simply forward notification.
457
-
458
- Assumes that content is not null and is SC.Array.
459
- */
460
- _scac_rangeDidChange: function(array, objects, key, indexes) {
461
- if (key !== '[]') { return ; } // nothing to do
462
-
463
- var content = this.get('content');
464
- this._scac_length = content.get('length');
465
- this._scac_cached = NO; // invalidate
466
-
467
- // if array length has changed, just notify every index from min up
468
- if (indexes) {
469
- this.beginPropertyChanges();
470
- indexes.forEachRange(function(start, length) {
471
- this.enumerableContentDidChange(start, length, 0);
472
- }, this);
473
- this.endPropertyChanges();
474
- this.updateSelectionAfterContentChange();
475
- }
476
- },
477
-
478
493
  /**
479
494
  @private
480
495
 
@@ -490,33 +505,6 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
490
505
  @param {Number} start the index at which the positions occurred
491
506
  */
492
507
  _scac_enumerableContentDidChange: function(addedObjects, removedObjects, start) {
493
- var enumerableChanges = this._scac_enumerableChanges || [];
494
-
495
- enumerableChanges.push([addedObjects, removedObjects, start]);
496
-
497
- this._scac_enumerableChanges = enumerableChanges;
498
- this.invokeOnce(this._scac_propagateEnumerableObservers);
499
-
500
- this.setupPropertyChainsForEnumerableContent(addedObjects, removedObjects);
501
- },
502
-
503
- /**
504
- @private
505
-
506
- At the end of the run loop, notifies enumerable observers on this array
507
- controller of changes we received from the content object.
508
- */
509
- _scac_propagateEnumerableObservers: function() {
510
- var enumerableChanges = this._scac_enumerableChanges;
511
- var idx, len, change;
512
-
513
- len = enumerableChanges.get('length');
514
- for (idx = 0; idx < len; idx++) {
515
- change = enumerableChanges[idx];
516
- this._notifyEnumerableObservers(change[0], change[1], change[2]);
517
- }
518
-
519
- this._scac_enumerableChanges = null;
520
508
  },
521
509
 
522
510
  /** @private
@@ -534,7 +522,10 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
534
522
  this._scac_length = newlen;
535
523
  this.beginPropertyChanges();
536
524
  this._scac_cached = NO; // invalidate
537
- this.enumerableContentDidChange(0, newlen, newlen-oldlen);
525
+ // If this is an unordered enumerable, we have no way
526
+ // of knowing which indices changed. Instead, we just
527
+ // invalidate the whole array.
528
+ this.arrayContentDidChange(0, oldlen, newlen);
538
529
  this.endPropertyChanges();
539
530
  this.updateSelectionAfterContentChange();
540
531
  }.observes('orderBy'),
@@ -175,9 +175,7 @@ SC.mixin(Function.prototype, /** @scope Function.prototype */ {
175
175
  to the function as well. Otherwise the function should have the
176
176
  signature:
177
177
 
178
- {{{
179
- function functionName(timer)
180
- }}}
178
+ function functionName(timer)
181
179
 
182
180
  @param target {Object} optional target object to use as this
183
181
  @param interval {Number} the time to wait, in msec