sproutcore 1.10.3.1 → 1.11.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (380) hide show
  1. checksums.yaml +8 -8
  2. data/CHANGELOG +4 -8
  3. data/VERSION.yml +2 -2
  4. data/lib/frameworks/sproutcore/Buildfile +5 -4
  5. data/lib/frameworks/sproutcore/CHANGELOG.md +274 -40
  6. data/lib/frameworks/sproutcore/CONTRIBUTORS.md +133 -0
  7. data/lib/frameworks/sproutcore/README.md +31 -144
  8. data/lib/frameworks/sproutcore/apps/showcase/controllers/source_tree_controller.js +9 -4
  9. data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +5 -0
  10. data/lib/frameworks/sproutcore/apps/showcase/system/views_item_content.js +1 -1
  11. data/lib/frameworks/sproutcore/apps/showcase/views/split_views.js +15 -2
  12. data/lib/frameworks/sproutcore/apps/showcase/views/stacked_views.js +1 -1
  13. data/lib/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +11 -1
  14. data/lib/frameworks/sproutcore/frameworks/ajax/mixins/websocket_delegate.js +90 -0
  15. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +81 -5
  16. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +23 -4
  17. data/lib/frameworks/sproutcore/frameworks/ajax/system/websocket.js +475 -0
  18. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +149 -26
  19. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/websocket.js +197 -0
  20. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/xhr_response_test.js +65 -0
  21. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +4 -0
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/horizontal_stack_layout.js +232 -52
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/vertical_stack_layout.js +235 -49
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +23 -13
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/object.js +3 -1
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/core.js +81 -1
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/english.lproj/ordinal.js +17 -0
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  29. data/lib/frameworks/sproutcore/frameworks/{desktop/tests/views/disclosure/methods.js → core_foundation/french.lproj/ordinal.js} +7 -4
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +2 -6
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +1 -1
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +104 -69
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane_statechart.js +6 -1
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/child_view_layout_protocol.js +59 -0
  35. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/view_transition_protocol.js +18 -1
  36. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/application.js +192 -0
  37. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/bezier_curves.js +52 -0
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +384 -64
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/core_query.js +6 -14
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/device.js +21 -35
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +72 -36
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +90 -34
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +55 -7
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +20 -15
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/req_anim_frame.js +9 -10
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +763 -542
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +4 -3
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +1 -7
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +14 -0
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/touch.js +538 -0
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils/rect.js +56 -1
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +99 -4
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/single_case.js +25 -19
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/core_tests.js +75 -0
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/ext/number_test.js +81 -0
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +4 -4
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/responder_context.js +4 -4
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +19 -1
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/color.js +36 -20
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/design_modes_test.js +83 -0
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/makeMainPane.js +7 -3
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/mouse_events.js +338 -0
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/root_responder.js +14 -89
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/touch.js +106 -0
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/sparse_array.js +2 -2
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/touch.js +136 -0
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/utils/rect.js +42 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +11 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/child_view.js +5 -5
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/design_mode_test.js +457 -0
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/sendEvent.js +36 -10
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/background_color.js +44 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/border_frame_test.js +51 -24
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/childViewLayout_test.js +176 -1
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +46 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/convertFrames.js +69 -15
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/didAppendToDocument.js +2 -2
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +7 -1
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +30 -10
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +376 -71
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/static_layout.js +0 -10
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +117 -34
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view_states_test.js +52 -2
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +656 -42
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +159 -38
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/cursor.js +0 -7
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/design_mode.js +206 -0
  88. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/enabled.js +0 -28
  89. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +21 -6
  90. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +372 -450
  91. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +28 -13
  92. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +22 -51
  93. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +59 -30
  94. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +0 -29
  95. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +22 -10
  96. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +42 -36
  97. data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +54 -3
  98. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +178 -59
  99. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +2 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +206 -132
  101. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +214 -118
  102. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +96 -13
  103. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +14 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +82 -42
  105. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +272 -177
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/store_interaction_test.js +54 -0
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +24 -16
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +6 -3
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/data_store.js +267 -35
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +57 -46
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +150 -53
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +57 -17
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +13 -9
  114. data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/many.js +2 -2
  115. data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/simple.js +0 -0
  116. data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/single.js +12 -2
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +20 -15
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +9 -2
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +80 -14
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_dataSourceCallbacks.js +280 -0
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_pushChanges.js +232 -0
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +31 -5
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +16 -2
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +60 -40
  125. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/materializeRecord.js +78 -0
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -1
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +20 -0
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/{resources → english.lproj}/strings.js +0 -0
  129. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/french.lproj/strings.js +45 -0
  130. data/lib/frameworks/sproutcore/frameworks/designer/designers/object_designer.js +7 -3
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +125 -44
  132. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +139 -48
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/draggable.js +202 -0
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +59 -56
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +13 -49
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +466 -305
  137. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +49 -12
  138. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +79 -21
  139. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/split.js +12 -2
  140. data/lib/frameworks/sproutcore/frameworks/desktop/resources/menu_item_view.css +8 -0
  141. data/lib/frameworks/sproutcore/frameworks/desktop/resources/overlay-scroller.css +187 -0
  142. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +94 -30
  143. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +163 -3
  144. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +97 -78
  145. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +61 -1
  146. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +7 -3
  147. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +47 -22
  148. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +66 -9
  149. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +21 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +12 -18
  151. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/methods.js +17 -14
  152. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  153. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +9 -6
  154. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/collection_fast_path.js +54 -21
  155. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +52 -20
  156. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +94 -4
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/keyboard.js +177 -0
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +13 -1
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +9 -9
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +18 -0
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +104 -0
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +48 -49
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/drag_and_drop.js +22 -18
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +17 -5
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/link_view_test.js +136 -0
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/contentIndexesInRect.js +77 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/drag_and_drop.js +53 -16
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/layoutForContentIndex.js +41 -0
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +25 -25
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +102 -27
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/{rowHeightForContentIndex.js → rowSizeForContentIndex.js} +7 -6
  172. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +2 -0
  173. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +70 -75
  174. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +29 -30
  175. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +57 -0
  176. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/menu_scroll_view/menu_scroll_view_test.js +206 -0
  177. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +15 -0
  178. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +15 -7
  179. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +16 -11
  180. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +164 -12
  181. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/scale.js +387 -0
  182. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/touch.js +549 -0
  183. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +214 -45
  184. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -5
  185. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +73 -22
  186. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +88 -3
  187. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/methods.js +8 -0
  188. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/methods.js +16 -1
  189. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/ui.js +54 -0
  190. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/dividers.js +21 -2
  191. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/static_content.js +31 -25
  192. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +109 -29
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +10 -1
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +3 -0
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +779 -603
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +106 -7
  197. data/lib/frameworks/sproutcore/frameworks/desktop/views/link_view.js +406 -0
  198. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +437 -245
  199. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +13 -0
  200. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +124 -62
  201. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +176 -597
  202. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroller_view.js +206 -0
  203. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +3 -0
  204. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +5 -4
  205. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +3 -0
  206. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +56 -158
  207. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +2560 -0
  208. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +458 -242
  209. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +117 -54
  210. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +18 -12
  211. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +162 -34
  212. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +30 -15
  213. data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +33 -7
  214. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +22 -2
  215. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +47 -22
  216. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +0 -6
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +2 -1
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form_row.js +21 -21
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -3
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/mixins/select_view_menu.js +24 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/ext/menu_resizing.js +1 -1
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/bindings.js +7 -4
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/check_selected.js +7 -9
  224. data/lib/frameworks/sproutcore/frameworks/{desktop/tests/panes/select_button/methods.js → experimental/frameworks/select_view/tests/views/select/method.js} +54 -76
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/selected_item.js +35 -0
  226. data/lib/frameworks/sproutcore/frameworks/{desktop/tests/panes/select_button → experimental/frameworks/select_view/tests/views/select}/ui.js +107 -36
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +225 -66
  228. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +39 -38
  229. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +5 -18
  230. data/lib/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +12 -0
  231. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/inflections.js +84 -0
  232. data/lib/frameworks/sproutcore/frameworks/foundation/french.lproj/inflections.js +41 -0
  233. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_mixin.js +1 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +7 -0
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +3 -4
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +6 -2
  237. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +408 -239
  238. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +2 -1
  240. data/lib/frameworks/sproutcore/frameworks/foundation/spanish.lproj/inflections.js +38 -0
  241. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +104 -76
  242. data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +20 -94
  243. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +33 -22
  244. data/lib/frameworks/sproutcore/frameworks/foundation/system/undo_manager.js +475 -0
  245. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/auto_resize_test.js +163 -1
  246. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +41 -0
  247. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +2 -5
  248. data/lib/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/methods.js +268 -0
  249. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/undo_manager.js +231 -0
  250. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +16 -0
  251. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +27 -0
  252. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +24 -0
  253. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +135 -6
  254. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/fade_transition.js +6 -0
  255. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/pop_transition.js +7 -0
  256. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/scale_transition.js +6 -0
  257. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/slide_transition.js +4 -0
  258. data/lib/frameworks/sproutcore/frameworks/foundation/transitions/swap_dissolve_transition.js +3 -1
  259. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +21 -21
  260. data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +65 -15
  261. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
  262. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +1 -1
  263. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +193 -213
  264. data/lib/frameworks/sproutcore/frameworks/jquery/{jquery-1.8.3-patched.js → jquery-1.11.1.js} +7507 -6684
  265. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +28 -11
  266. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +26 -0
  267. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +54 -25
  268. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +0 -6
  269. data/lib/frameworks/sproutcore/frameworks/runtime/ext/number.js +36 -0
  270. data/lib/frameworks/sproutcore/frameworks/runtime/ext/window.js +25 -0
  271. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +3 -3
  272. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1 -1
  273. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +156 -66
  274. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +2 -2
  275. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +150 -65
  276. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +57 -11
  277. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +68 -49
  278. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +14 -6
  279. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +23 -23
  280. data/lib/frameworks/sproutcore/frameworks/runtime/tests/ext/number_test.js +44 -0
  281. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +0 -10
  282. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable.js +340 -285
  283. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +104 -3
  284. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/observer_set.js +14 -1
  285. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +15 -2
  286. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +21 -18
  287. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +52 -19
  288. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/pane.js +27 -24
  289. data/lib/frameworks/sproutcore/frameworks/template_view/controls/button.js +30 -0
  290. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/bind.js +1 -1
  291. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/collection.js +2 -0
  292. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/view.js +1 -0
  293. data/lib/frameworks/sproutcore/frameworks/template_view/tests/mixins/template_helpers/checkbox_support.js +2 -2
  294. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/handlebars.js +4 -2
  295. data/lib/frameworks/sproutcore/frameworks/template_view/views/bindable_span.js +1 -1
  296. data/lib/frameworks/sproutcore/frameworks/template_view/views/template_collection.js +16 -14
  297. data/lib/frameworks/sproutcore/frameworks/testing/core.js +5 -3
  298. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +13 -0
  299. data/lib/frameworks/sproutcore/lib/index.rhtml +2 -2
  300. data/lib/frameworks/sproutcore/phantomjs/test_runner.js +28 -7
  301. data/lib/frameworks/sproutcore/scripts/run_sc_server_master.sh +1 -1
  302. data/lib/frameworks/sproutcore/themes/ace/resources/_variables.css +2 -0
  303. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +1 -0
  304. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +3 -4
  305. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal.css +15 -15
  306. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_overlay.css +74 -0
  307. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical.css +11 -13
  308. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical_overlay.css +74 -0
  309. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob-active.png +0 -0
  310. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob-active@2x.png +0 -0
  311. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob.png +0 -0
  312. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob@2x.png +0 -0
  313. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/{22px → jumbo}/slider.css +9 -4
  314. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/track.png +0 -0
  315. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/track@2x.png +0 -0
  316. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob-active.png +0 -0
  317. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob-active@2x.png +0 -0
  318. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob.png +0 -0
  319. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob@2x.png +0 -0
  320. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/slider.css +32 -0
  321. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/track.png +0 -0
  322. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/track@2x.png +0 -0
  323. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.css +13 -0
  324. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob-active.png +0 -0
  325. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob-active@2x.png +0 -0
  326. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob.png +0 -0
  327. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob@2x.png +0 -0
  328. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/slider.css +32 -0
  329. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/track.png +0 -0
  330. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/track@2x.png +0 -0
  331. data/lib/frameworks/sproutcore/themes/ace/resources/split/split.css +2 -3
  332. data/lib/sproutcore/builders/chance_file.rb +3 -3
  333. data/lib/sproutcore/helpers/minifier.rb +1 -0
  334. data/vendor/chance/lib/chance/instance.rb +34 -34
  335. data/vendor/chance/lib/chance/instance/spriting.rb +21 -16
  336. metadata +81 -58
  337. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/visibility.js +0 -17
  338. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +0 -710
  339. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +0 -267
  340. data/lib/frameworks/sproutcore/frameworks/desktop/resources/touch-scroller.css +0 -196
  341. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +0 -224
  342. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +0 -163
  343. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +0 -177
  344. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +0 -2053
  345. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +0 -1024
  346. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +0 -404
  347. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +0 -28
  348. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +0 -235
  349. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +0 -363
  350. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +0 -250
  351. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/README.md +0 -47
  352. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/models/record.js +0 -134
  353. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +0 -92
  354. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +0 -25
  355. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +0 -33
  356. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +0 -76
  357. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +0 -25
  358. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +0 -143
  359. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +0 -256
  360. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +0 -1164
  361. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +0 -332
  362. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +0 -236
  363. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +0 -347
  364. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +0 -15
  365. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +0 -10
  366. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +0 -804
  367. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +0 -133
  368. data/lib/frameworks/sproutcore/frameworks/foundation/tasks/preload_bundle.js +0 -41
  369. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_touch.css +0 -91
  370. data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical_touch.css +0 -92
  371. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/knob.png +0 -0
  372. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/knob_active.png +0 -0
  373. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/slider.css +0 -27
  374. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/knob.png +0 -0
  375. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/knob_active.png +0 -0
  376. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/slider.css +0 -27
  377. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/knob.png +0 -0
  378. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/knob_active.png +0 -0
  379. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/track.png +0 -0
  380. data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/track.png +0 -0
@@ -128,8 +128,8 @@ SC.ObserverSet = {
128
128
  for( var i=0, l=members.length; i<l; i++ ) {
129
129
  member = members[i];
130
130
 
131
- // method.call(target);
132
- member[1].call(member[0]);
131
+ // Call the method (member[1]) on the target (member[0]) with the context (member[2])
132
+ member[1].call(member[0], member[2]);
133
133
 
134
134
  //@if(debug)
135
135
  // If we have logging info specified for who scheduled the particular
@@ -71,16 +71,35 @@ SC.EMPTY_PLACEHOLDER = '@@EMPTY@@';
71
71
  property of your object instance automatically. Now the two values will be
72
72
  kept in sync.
73
73
 
74
- Customizing Your Bindings
74
+ One-Way Bindings
75
+ ===
76
+
77
+ By default, bindings are set up as two-way. In cases where you only need the
78
+ binding to function in one direction, for example if a value from a controller
79
+ is bound into a read-only LabelView, then for performance reasons you should
80
+ use a one-way binding. To do this, call the very useful `oneWay` helper:
81
+
82
+ valueBinding: SC.Binding.oneWay('MyApp.someController.title')
83
+
84
+ or:
85
+
86
+ valueBinding: SC.Binding.from('MyApp.someController.title').oneWay()
87
+
88
+ This way if the value of MyApp.someController.title changes, your object's
89
+ `value` will also update. Since `value` will never update on its own, this will
90
+ avoid the setup time required to plumb the binding in the other direction,
91
+ nearly doubling performance for this binding.
92
+
93
+ Transforms
75
94
  ===
76
95
 
77
96
  In addition to synchronizing values, bindings can also perform some basic
78
97
  transforms on values. These transforms can help to make sure the data fed
79
- into one object always meets the expectations of that object regardless of
98
+ into one object always meets the expectations of that object, regardless of
80
99
  what the other object outputs.
81
100
 
82
101
  To customize a binding, you can use one of the many helper methods defined
83
- on SC.Binding like so:
102
+ on SC.Binding. For example:
84
103
 
85
104
  valueBinding: SC.Binding.single("MyApp.someController.title")
86
105
 
@@ -98,29 +117,14 @@ SC.EMPTY_PLACEHOLDER = '@@EMPTY@@';
98
117
  or an empty string). If it is empty, the value will be set to the string
99
118
  "(EMPTY)".
100
119
 
101
- One Way Bindings
102
- ===
103
-
104
- One especially useful binding customization you can use is the oneWay()
105
- helper. This helper tells SproutCore that you are only interested in
106
- receiving changes on the object you are binding from. For example, if you
107
- are binding to a preference and you want to be notified if the preference
108
- has changed, but your object will not be changing the preference itself, you
109
- could do:
110
-
111
- bigTitlesBinding: SC.Binding.oneWay("MyApp.preferencesController.bigTitles")
112
-
113
- This way if the value of MyApp.preferencesController.bigTitles changes the
114
- "bigTitles" property of your object will change also. However, if you
115
- change the value of your "bigTitles" property, it will not update the
116
- preferencesController.
120
+ The following transform helper methods are included: `noError`, `single`, `notEmpty`,
121
+ `notNull`, `multiple`, `bool`, `not`, `isNull`, `and` (two values only), `or` (two
122
+ values only), and `equalTo`. See each method's documentation for a full description.
117
123
 
118
- One way bindings are almost twice as fast to setup and twice as fast to
119
- execute because the binding only has to worry about changes to one side.
120
-
121
- You should consider using one way bindings anytime you have an object that
122
- may be created frequently and you do not intend to change a property; only
123
- to monitor it for changes. (such as in the example above).
124
+ (Note that transforms are only applied in the forward direction (the 'to' side); values
125
+ are applied untransformed to the 'from' side. If the 'from' object has validation
126
+ needs, it should own and apply them itself, for example via a read/write calculated
127
+ property.)
124
128
 
125
129
  Adding Custom Transforms
126
130
  ===
@@ -196,7 +200,10 @@ SC.EMPTY_PLACEHOLDER = '@@EMPTY@@';
196
200
  the result of these customizations will be a binding template, not a fully
197
201
  active binding. The binding will actually become active only when you
198
202
  instantiate the object the binding belongs to. It is useful however, to
199
- understand what actually happens when the binding is activated.
203
+ understand what actually happens when the binding is activated. (Of course
204
+ you should always use the highest-level APIs available, even if you understand
205
+ how it works underneath; unless you have specific needs, you should rely on
206
+ the convenience `fooBinding` format.)
200
207
 
201
208
  For a binding to function it must have at least a "from" property and a "to"
202
209
  property. The from property path points to the object/key that you want to
@@ -246,14 +253,19 @@ SC.EMPTY_PLACEHOLDER = '@@EMPTY@@';
246
253
  });
247
254
 
248
255
  SproutCore's built in binding creation method make it easy to automatically
249
- create bindings for you. You should always use the highest-level APIs
250
- available, even if you understand how to it works underneath.
256
+ create bindings for you. If you need further documentation on SC.Binding's inner
257
+ workings, see the private method documentation in the source code.
251
258
 
252
259
  @since SproutCore 1.0
253
260
  */
254
261
  SC.Binding = /** @scope SC.Binding.prototype */{
255
262
 
256
263
  /**
264
+ Quack.
265
+ */
266
+ isBinding: YES,
267
+
268
+ /** @private
257
269
  This is the core method you use to create a new binding instance. The
258
270
  binding instance will have the receiver instance as its parent which means
259
271
  any configuration you have there will be inherited.
@@ -277,7 +289,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
277
289
  return ret;
278
290
  },
279
291
 
280
- /**
292
+ /** @private
281
293
  Returns a builder function for compatibility.
282
294
  */
283
295
  builder: function () {
@@ -318,9 +330,13 @@ SC.Binding = /** @scope SC.Binding.prototype */{
318
330
  },
319
331
 
320
332
  /**
321
- This will set the "to" property path to the specified value. It will not
322
- attempt to reoslve this property path to an actual object/property tuple
323
- until you connect the binding.
333
+ This will set the "to" property path to the specified value. It will not
334
+ attempt to reoslve this property path to an actual object/property tuple
335
+ until you connect the binding.
336
+
337
+ If you are using the convenience format `fooBinding`, for example
338
+ `isVisibleBinding`, you do not need to call this method, as the `to` property
339
+ path will be generated for you when its object is created.
324
340
 
325
341
  @param {String|Tuple} propertyPath A property path or tuple
326
342
  @param {Object} [root] root object to use when resolving the path.
@@ -427,7 +443,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
427
443
  }
428
444
  },
429
445
 
430
- /**
446
+ /**
431
447
  Disconnects the binding instance. Changes will no longer be relayed. You
432
448
  will not usually need to call this method.
433
449
 
@@ -456,7 +472,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
456
472
  return this;
457
473
  },
458
474
 
459
- /**
475
+ /** @private
460
476
  Indicates when the binding has been destroyed.
461
477
 
462
478
  @type Boolean
@@ -464,7 +480,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
464
480
  */
465
481
  isDestroyed: NO,
466
482
 
467
- /**
483
+ /** @private
468
484
  Disconnects the binding and removes all properties and external references. Called by
469
485
  either binding target object when destroyed.
470
486
 
@@ -495,7 +511,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
495
511
  this._toObserverData = this._fromObserverData = null;
496
512
  },
497
513
 
498
- /**
514
+ /** @private
499
515
  Invoked whenever the value of the "from" property changes. This will mark
500
516
  the binding as dirty if the value has changed.
501
517
 
@@ -530,7 +546,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
530
546
  }
531
547
  },
532
548
 
533
- /**
549
+ /** @private
534
550
  Invoked whenever the value of the "to" property changes. This will mark the
535
551
  binding as dirty only if:
536
552
 
@@ -572,6 +588,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
572
588
  }
573
589
  },
574
590
 
591
+ /** @private */
575
592
  _scheduleSync: function () {
576
593
  if (SC.RunLoop.isRunLoopInProgress() || SC.Binding._syncScheduled) { return; }
577
594
  SC.Binding._syncScheduled = YES;
@@ -594,26 +611,36 @@ SC.Binding = /** @scope SC.Binding.prototype */{
594
611
  _computeBindingValue: function () {
595
612
  var source = this._bindingSource,
596
613
  key = this._bindingKey,
597
- v, idx;
614
+ v;
598
615
 
599
616
  this._bindingValue = v = (source ? source.getPath(key) : null);
617
+ this._transformedBindingValue = this._computeTransformedValue(v);
618
+ },
619
+
620
+ /** @private
621
+ Applies transforms to the value and returns the transfomed value.
622
+ @param {*} value Binding value to transform
623
+ @returns {*} Transformed value
624
+ */
625
+ _computeTransformedValue: function (value) {
626
+ var transforms = this._transforms,
627
+ idx,
628
+ len,
629
+ transform;
600
630
 
601
- // apply any transforms to get the to property value also
602
- var transforms = this._transforms;
603
631
  if (transforms) {
604
- var len = transforms.length,
605
- transform;
632
+ len = transforms.length;
606
633
  for (idx = 0; idx < len; idx++) {
607
634
  transform = transforms[idx];
608
- v = transform(v, this);
635
+ value = transform(value, this);
609
636
  }
610
637
  }
611
638
 
612
639
  // if error objects are not allowed, and the value is an error, then
613
640
  // change it to null.
614
- if (this._noError && SC.typeOf(v) === SC.T_ERROR) v = null;
641
+ if (this._noError && SC.typeOf(value) === SC.T_ERROR) { value = null; }
615
642
 
616
- this._transformedBindingValue = v;
643
+ return value;
617
644
  },
618
645
 
619
646
  _connectQueue: SC.CoreSet.create(),
@@ -621,8 +648,8 @@ SC.Binding = /** @scope SC.Binding.prototype */{
621
648
  _changeQueue: SC.CoreSet.create(),
622
649
  _alternateChangeQueue: SC.CoreSet.create(),
623
650
 
624
- /**
625
- Call this method on SC.Binding to flush all bindings with changed pending.
651
+ /** @private
652
+ Call this method on SC.Binding to flush all bindings with changes pending.
626
653
 
627
654
  @returns {Boolean} YES if changes were flushed.
628
655
  */
@@ -676,7 +703,7 @@ SC.Binding = /** @scope SC.Binding.prototype */{
676
703
  return didFlush;
677
704
  },
678
705
 
679
- /**
706
+ /** @private
680
707
  This method is called at the end of the Run Loop to relay the changed
681
708
  binding value from one side to the other.
682
709
  */
@@ -731,9 +758,14 @@ SC.Binding = /** @scope SC.Binding.prototype */{
731
758
  just changed.
732
759
 
733
760
  This method is useful when you are dynamically connecting bindings to a
734
- network of objects that may have already been initialized.
761
+ network of objects that may have already been initialized. Otherwise you
762
+ should not need to call this method.
735
763
  */
736
764
  sync: function () {
765
+ var target,
766
+ key,
767
+ v,
768
+ tv;
737
769
 
738
770
  // do nothing if not connected
739
771
  if (!this.isConnected) return this;
@@ -745,8 +777,8 @@ SC.Binding = /** @scope SC.Binding.prototype */{
745
777
  // we are connected, go ahead and sync
746
778
  } else {
747
779
  this._computeBindingTargets();
748
- var target = this._fromTarget,
749
- key = this._fromPropertyKey;
780
+ target = this._fromTarget;
781
+ key = this._fromPropertyKey;
750
782
  if (!target || !key) return this; // nothing to do
751
783
 
752
784
  // Let's check for whether target is a valid observable with getPath.
@@ -754,16 +786,30 @@ SC.Binding = /** @scope SC.Binding.prototype */{
754
786
  //
755
787
  // If we have a target, it is ready, but if it is invalid, that is WRONG.
756
788
  if (!target.isObservable) {
757
- SC.Logger.warn("Cannot bind '%@' to property '%@' on non-observable '%@'".fmt(this._toPropertyPath, key, target));
789
+ //@if(debug)
790
+ // Provide some developer support.
791
+ if (target === window) {
792
+ var msg = "Developer Warning: You are attempting to bind \"%{to_root}\"'s '%{to_property}' property to the non-observable 'window.%{key}'. It's likely that you've specified a local binding path without prepending a period. For example, you may have `%{to_property}Binding: '%{key}'` instead of `%{to_property}Binding: '.%{key}'`.";
793
+ msg = msg.fmt({
794
+ to_root: (this._toRoot || 'object').toString(),
795
+ to_property: this._toPropertyPath,
796
+ key: key
797
+ });
798
+ SC.Logger.warn(msg);
799
+ } else {
800
+ SC.Logger.warn("Developer Warning: Cannot bind \"%@\"'s '%@' property to property '%@' on non-observable '%@'".fmt((this._toRoot || 'object').toString(), this._toPropertyPath, key, target));
801
+ }
802
+ //@endif
758
803
  return this;
759
804
  }
760
805
 
761
806
  // get the new value
762
- var v = target.getPath(key);
807
+ v = target.getPath(key);
808
+ tv = this._computeTransformedValue(v);
763
809
 
764
810
  // if the new value is different from the current binding value, then
765
811
  // schedule to register an update.
766
- if (v !== this._bindingValue || key === '[]') {
812
+ if (v !== this._bindingValue || tv !== this._transformedBindingValue || key === '[]') {
767
813
  this._setBindingValue(target, key);
768
814
  SC.Binding._changeQueue.add(this); // save for later.
769
815
  }
@@ -772,9 +818,12 @@ SC.Binding = /** @scope SC.Binding.prototype */{
772
818
  return this;
773
819
  },
774
820
 
775
- // set if you call sync() when the binding connection is still pending.
821
+ /** @private
822
+ set if you call sync() when the binding connection is still pending.
823
+ */
776
824
  _syncOnConnect: NO,
777
825
 
826
+ /** @private */
778
827
  _computeBindingTargets: function () {
779
828
  var path, root, tuple;
780
829
 
@@ -820,11 +869,15 @@ SC.Binding = /** @scope SC.Binding.prototype */{
820
869
  }
821
870
  },
822
871
 
872
+ // -------------------------------
873
+ // Helper Methods
874
+ //
875
+
823
876
  /**
824
877
  Configures the binding as one way. A one-way binding will relay changes
825
878
  on the "from" side to the "to" side, but not the other way around. This
826
- means that if you change the "to" side directly, the "from" side may have
827
- a different value.
879
+ means that if you change the "to" side directly, the "from" side will not
880
+ be updated, and may have a different value.
828
881
 
829
882
  @param {String} [fromPath] from path to connect.
830
883
  @param {Boolean} [aFlag] Pass NO to set the binding back to two-way
@@ -853,10 +906,14 @@ SC.Binding = /** @scope SC.Binding.prototype */{
853
906
 
854
907
  function (value) {};
855
908
 
909
+ or:
910
+
911
+ function (value, binding) {};
912
+
856
913
  It must return either the transformed value or an error object.
857
914
 
858
915
  Transform functions are chained, so they are called in order. If you are
859
- extending a binding and want to reset the transforms, you can call
916
+ extending a binding and want to reset its transforms, you can call
860
917
  resetTransform() first.
861
918
 
862
919
  @param {Function} transformFunc the transform function.
@@ -1046,16 +1103,18 @@ SC.Binding = /** @scope SC.Binding.prototype */{
1046
1103
 
1047
1104
  /* @private Used with the logic gate bindings. */
1048
1105
  _LogicGateAnd: SC.Object.extend({
1049
- logicProperty: function() {
1106
+ logicProperty: function () {
1050
1107
  return (this.get('valueA') && this.get('valueB'));
1051
1108
  }.property('valueA', 'valueB').cacheable()
1052
1109
  }),
1110
+
1053
1111
  /* @private Used with the logic gate bindings. */
1054
1112
  _LogicGateOr: SC.Object.extend({
1055
- logicProperty: function() {
1113
+ logicProperty: function () {
1056
1114
  return (this.get('valueA') || this.get('valueB'));
1057
1115
  }.property('valueA', 'valueB').cacheable()
1058
1116
  }),
1117
+
1059
1118
  /* @private Used by logic gate bindings. */
1060
1119
  _logicGateBinding: function (gateClass, pathA, pathB) {
1061
1120
  // If either path is local, remove any * chains and append the localObject path to it.
@@ -1070,11 +1129,11 @@ SC.Binding = /** @scope SC.Binding.prototype */{
1070
1129
 
1071
1130
  // Gets the gate class and instantiates a nice copy.
1072
1131
  var gateHash = {
1073
- localObject: null,
1074
- valueABinding: SC.Binding.oneWay(pathA),
1075
- valueBBinding: SC.Binding.oneWay(pathB)
1076
- },
1077
- gate = gateClass.create(gateHash);
1132
+ localObject: null,
1133
+ valueABinding: SC.Binding.oneWay(pathA),
1134
+ valueBBinding: SC.Binding.oneWay(pathB)
1135
+ },
1136
+ gate = gateClass.create(gateHash);
1078
1137
 
1079
1138
  // Creates and populates the return binding.
1080
1139
  var ret = this.from('logicProperty', gate).oneWay();
@@ -1130,6 +1189,32 @@ SC.Binding = /** @scope SC.Binding.prototype */{
1130
1189
  return this._logicGateBinding(this._LogicGateOr, pathA, pathB);
1131
1190
  },
1132
1191
 
1192
+ /**
1193
+ Adds a transform that will return YES if the value is equal to equalValue, NO otherwise.
1194
+
1195
+ isVisibleBinding: SC.Binding.oneWay("MyApp.someController.title").equalTo(comparisonValue)
1196
+
1197
+ Or:
1198
+
1199
+ isVisibleBinding: SC.Binding.equalTo("MyApp.someController.title", comparisonValue)
1200
+
1201
+ @param {String} fromPath from path or null
1202
+ @param {Object} equalValue the value to compare with
1203
+ @returns {SC.Binding} this
1204
+ */
1205
+ equalTo: function(fromPath, equalValue) {
1206
+ // Normalize arguments.
1207
+ if (equalValue === undefined) {
1208
+ equalValue = fromPath;
1209
+ fromPath = null;
1210
+ }
1211
+
1212
+ return this.from(fromPath).transform(function(value, binding) {
1213
+ return value === equalValue;
1214
+ });
1215
+ },
1216
+
1217
+ /** @private */
1133
1218
  toString: function () {
1134
1219
  var from = this._fromRoot ? "<%@>:%@".fmt(this._fromRoot, this._fromPropertyPath) : this._fromPropertyPath;
1135
1220
 
@@ -67,28 +67,54 @@ SC.IndexSet = SC.mixin({},
67
67
  return ret;
68
68
  },
69
69
 
70
+ //@if(debug)
71
+ /** @private Validates the standard IndexSet method arguments. */
72
+ _sc_validateIndexSetArguments: function (start, length) {
73
+ // Validate arguments. Potential bad usages include trying to call SC.IndexSet.create() with SproutCore's standard property-hash
74
+ // idiom, and passing in the results of bad math (NaN in particular causes problems).
75
+ var startIsValid = NO,
76
+ lengthIsValid = NO;
77
+ // Unpack hash.
78
+ if (SC.typeOf(start) === SC.T_HASH && !start.isIndexSet && SC.none(length)) {
79
+ length = start.length;
80
+ start = start.start;
81
+ }
82
+ // Validate start.
83
+ if (SC.none(start)) startIsValid = YES;
84
+ else if (SC.typeOf(start) === SC.T_NUMBER && !isNaN(start)) startIsValid = YES;
85
+ else if (start.isIndexSet && SC.none(length)) startIsValid = YES;
86
+ // Validate length.
87
+ if (SC.none(start) && !SC.none(length)) lengthIsValid = NO; // stay invalid.
88
+ else if (SC.none(length)) lengthIsValid = YES;
89
+ else if (SC.typeOf(length) === SC.T_NUMBER && !isNaN(length)) lengthIsValid = YES;
90
+ // Check validitty and throw if needed.
91
+ if (!startIsValid || !lengthIsValid) {
92
+ var argsString = SC.A(arguments).join(', ');
93
+ throw new Error("SC.IndexSet created with invalid parameters (%@). You must call SC.IndexSet with zero, one or two valid numeric arguments.".fmt(argsString));
94
+ }
95
+ },
96
+ //@endif
97
+
70
98
  /**
71
- To create a set, pass either a start and index or another IndexSet.
99
+ To create an empty IndexSet, call `create` with no arguments. To create a set with one index, call `create` with one
100
+ argument: the index to add. To create a fuller set, call create with two arguments: the start index and the length to
101
+ add.
102
+
103
+ To create a more complicated set of indices, create an index set and populate individual ranges using `.add()`.
72
104
 
73
105
  @param {Number|SC.IndexSet} start The start of the range or an index set.
74
106
  @param {Number} [length] The length of the range (by default set to 1 if start is a Number)
75
107
  @returns {SC.IndexSet}
76
108
  */
77
109
  create: function (start, length) {
110
+ //@if (debug)
111
+ this._sc_validateIndexSetArguments.apply(this, arguments);
112
+ //@endif
113
+
78
114
  var ret = SC.beget(this);
79
115
  ret.initObservable();
80
116
  ret.registerDependentKey('min', '[]');
81
117
 
82
- // @if (debug)
83
- // Validate the input to ensure that the parameters
84
- // match the function definition.
85
- // This is here because `create` doesn't follow the
86
- // idiomatic SC convention of passing in an object literal to `create`.
87
- if (start && !(SC.typeOf(start) === SC.T_NUMBER || start.isIndexSet)) {
88
- throw new Error("SC.IndexSet does not accept `%@` as a parameter to `create`. Take a look at the function signature for proper usage.".fmt(start));
89
- }
90
- // @endif
91
-
92
118
  // optimized method to clone an index set.
93
119
  if (start && start.isIndexSet) {
94
120
  ret._content = this._sc_sliceContent(start._content);
@@ -288,6 +314,10 @@ SC.IndexSet = SC.mixin({},
288
314
  @returns {Boolean}
289
315
  */
290
316
  contains: function (start, length) {
317
+ //@if (debug)
318
+ this._sc_validateIndexSetArguments.apply(this, arguments);
319
+ //@endif
320
+
291
321
  var content, cur, next, rstart, rnext;
292
322
 
293
323
  // normalize input
@@ -336,6 +366,10 @@ SC.IndexSet = SC.mixin({},
336
366
  @returns {Boolean}
337
367
  */
338
368
  intersects: function (start, length) {
369
+ //@if (debug)
370
+ this._sc_validateIndexSetArguments.apply(this, arguments);
371
+ //@endif
372
+
339
373
  var content, cur, next, lim;
340
374
 
341
375
  // normalize input
@@ -398,6 +432,9 @@ SC.IndexSet = SC.mixin({},
398
432
  @returns {SC.IndexSet} receiver
399
433
  */
400
434
  replace: function (start, length) {
435
+ //@if (debug)
436
+ this._sc_validateIndexSetArguments.apply(this, arguments);
437
+ //@endif
401
438
 
402
439
  if (length === undefined) {
403
440
  if (typeof start === SC.T_NUMBER) {
@@ -434,6 +471,9 @@ SC.IndexSet = SC.mixin({},
434
471
  @returns {SC.IndexSet} receiver
435
472
  */
436
473
  add: function (start, length) {
474
+ //@if (debug)
475
+ this._sc_validateIndexSetArguments.apply(this, arguments);
476
+ //@endif
437
477
 
438
478
  if (this.isFrozen) throw SC.FROZEN_ERROR;
439
479
 
@@ -608,6 +648,9 @@ SC.IndexSet = SC.mixin({},
608
648
  @returns {SC.IndexSet} receiver
609
649
  */
610
650
  remove: function (start, length) {
651
+ //@if (debug)
652
+ this._sc_validateIndexSetArguments.apply(this, arguments);
653
+ //@endif
611
654
 
612
655
  if (this.isFrozen) throw SC.FROZEN_ERROR;
613
656
 
@@ -938,6 +981,9 @@ SC.IndexSet = SC.mixin({},
938
981
  @returns {Number} count of indexes
939
982
  */
940
983
  lengthIn: function (start, length) {
984
+ //@if (debug)
985
+ this._sc_validateIndexSetArguments.apply(this, arguments);
986
+ //@endif
941
987
 
942
988
  var ret = 0;
943
989