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
@@ -46,7 +46,7 @@ sc_require('views/segment');
46
46
  SC.SegmentedView = SC.View.extend(SC.Control,
47
47
  /** @scope SC.SegmentedView.prototype */ {
48
48
 
49
- /**
49
+ /** @private
50
50
  @ field
51
51
  @type Boolean
52
52
  @default YES
@@ -56,7 +56,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
56
56
  return NO;
57
57
  }.property('isEnabledInPane').cacheable(),
58
58
 
59
- /**
59
+ /** @private
60
60
  @type String
61
61
  @default 'tablist'
62
62
  @readOnly
@@ -64,7 +64,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
64
64
  //ariaRole: 'tablist',
65
65
  ariaRole: 'group', // workaround for <rdar://problem/10444670>; switch back to 'tablist' later with <rdar://problem/10463928> (also see segment.js)
66
66
 
67
- /**
67
+ /** @private
68
68
  @type Array
69
69
  @default ['sc-segmented-view']
70
70
  @see SC.View#classNames
@@ -296,6 +296,22 @@ SC.SegmentedView = SC.View.extend(SC.Control,
296
296
  */
297
297
  segmentViewClass: SC.SegmentView,
298
298
 
299
+ /**
300
+ Set to YES if you would like your SegmentedView to size itself based on its
301
+ visible segments. Useful if you're using SegmentedView in a flowed context
302
+ (for example if its parent view has `childViewLayout: SC.View.HORIZONTAL_STACK`).
303
+
304
+ The view will not auto-resize unless you define an initial value for the layout
305
+ property which will be auto-resized (i.e. `width` when in the default horizontal
306
+ orientation). This is to prevent the view from inappropriately adding width to a
307
+ flexible (`{ left: 0, right: 0 }`) layout.
308
+
309
+ Has no effect if `shouldHandleOverflow` is NO.
310
+
311
+ @type Boolean
312
+ @default NO
313
+ */
314
+ shouldAutoResize: NO,
299
315
 
300
316
  /** @private
301
317
  The following properties are used to map items to child views. Item keys
@@ -356,17 +372,17 @@ SC.SegmentedView = SC.View.extend(SC.Control,
356
372
  */
357
373
  itemsDidChange: function () {
358
374
  var items = this.get('items') || [],
359
- localItem, // Used to avoid altering the original items
360
- previousItem,
361
- childViews = this.get('childViews'),
362
- childView,
363
- overflowView = childViews.lastObject(),
364
- value = this.get('value'), // The value can change if items that were once selected are removed
365
- isSelected,
366
- itemKeys = this.get('itemKeys'),
367
- itemKey,
368
- segmentViewClass = this.get('segmentViewClass'),
369
- i, j;
375
+ localItem, // Used to avoid altering the original items
376
+ previousItem,
377
+ childViews = this.get('childViews'),
378
+ childView,
379
+ overflowView = this.get('overflowView'),
380
+ value = this.get('value'), // The value can change if items that were once selected are removed
381
+ isSelected,
382
+ itemKeys = this.get('itemKeys'),
383
+ itemKey,
384
+ segmentViewClass = this.get('segmentViewClass'),
385
+ i, j;
370
386
 
371
387
  // Update childViews
372
388
  if (childViews.get('length') - 1 > items.get('length')) { // We've lost segments (ie. childViews)
@@ -523,7 +539,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
523
539
  visibleDim = isHorizontal ? this.$().width() : this.$().height();
524
540
 
525
541
  // Only overflow if we've gone below the minimum dimension required to fit all the segments
526
- if (this.get('shouldHandleOverflow') && (this.isOverflowing || visibleDim <= this.cachedMinimumDim)) {
542
+ if (this.get('shouldHandleOverflow') && (this.get('isOverflowing') || visibleDim <= this.cachedMinimumDim)) {
527
543
  this.invokeLast(this.remeasure);
528
544
  }
529
545
  },
@@ -549,7 +565,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
549
565
 
550
566
  if (this.get('isVisibleInWindow')) {
551
567
  // Make all the views visible so that they can be measured
552
- overflowView = childViews.lastObject();
568
+ overflowView = this.get('overflowView');
553
569
  overflowView.set('isVisible', YES);
554
570
 
555
571
  for (var i = childViews.get('length') - 1; i >= 0; i--) {
@@ -572,15 +588,24 @@ SC.SegmentedView = SC.View.extend(SC.Control,
572
588
  var childViews = this.get('childViews'),
573
589
  childView,
574
590
  value = this.get('value'),
575
- overflowView = childViews.lastObject(),
591
+ overflowView = this.get('overflowView'),
576
592
  isHorizontal = this.get('layoutDirection') === SC.LAYOUT_HORIZONTAL,
593
+ layoutProperty = isHorizontal ? 'width' : 'height',
577
594
  visibleDim = isHorizontal ? this.$().width() : this.$().height(), // The inner width/height of the div
578
595
  curElementsDim = 0,
579
- dimToFit,
580
- length, i;
596
+ dimToFit, length, i,
597
+ isOverflowing = NO,
598
+ wantsAutoResize = this.get('shouldAutoResize'),
599
+ canAutoResize = !SC.none(this.getPath('layout.%@'.fmt(layoutProperty))),
600
+ willAutoResize = wantsAutoResize && canAutoResize;
601
+
602
+ // If child views and cachedDims lengths are out of sync here, it means adjustOverflow
603
+ // got called in between itemsDidChange and remeasure. Since we know that the remeasure is
604
+ // scheduled, just return and let the remeasure + adjustOverflow happen later.
605
+ if (childViews.get('length') !== this.cachedDims.length + 1) { return; }
581
606
 
582
607
  // This variable is useful to optimize when we are overflowing
583
- this.isOverflowing = NO;
608
+ isOverflowing = NO;
584
609
  overflowView.set('isSelected', NO);
585
610
 
586
611
  // Clear out the overflow items (these are the items not currently visible)
@@ -591,16 +616,18 @@ SC.SegmentedView = SC.View.extend(SC.Control,
591
616
  childView = childViews.objectAt(i);
592
617
  curElementsDim += this.cachedDims[i];
593
618
 
594
- // check for an overflow (leave room for the overflow segment except for with the last segment)
595
- dimToFit = (i === length - 1) ? curElementsDim : curElementsDim + this.cachedOverflowDim;
619
+ // Check and see if this item kicks us over into overflow.
620
+ if (!isOverflowing && !willAutoResize) {
621
+ // (don't leave room for the overflow segment on the last item)
622
+ dimToFit = (i === length - 1) ? curElementsDim : curElementsDim + this.cachedOverflowDim;
623
+ if (dimToFit > visibleDim) isOverflowing = YES;
624
+ }
596
625
 
597
- if (dimToFit > visibleDim) {
626
+ // Update the view depending on overflow state.
627
+ if (isOverflowing) {
598
628
  // Add the localItem to the overflowItems
599
629
  this.overflowItems.pushObject(childView.get('localItem'));
600
630
 
601
- // Record that we're now overflowing
602
- this.isOverflowing = YES;
603
-
604
631
  childView.set('isVisible', NO);
605
632
 
606
633
  // If the first item is already overflowed, make the overflowView first segment
@@ -618,9 +645,16 @@ SC.SegmentedView = SC.View.extend(SC.Control,
618
645
  }
619
646
  }
620
647
 
621
- // Show/hide the overflow view if we have overflowed
622
- if (this.isOverflowing) overflowView.set('isVisible', YES);
623
- else overflowView.set('isVisible', NO);
648
+ // Show/hide the overflow view as needed.
649
+ overflowView.set('isVisible', isOverflowing);
650
+
651
+ // Set the overflowing property.
652
+ this.setIfChanged('isOverflowing', isOverflowing);
653
+
654
+ // Autosize if needed.
655
+ if (willAutoResize) {
656
+ this.adjust(layoutProperty, this.isOverflowing ? this.cachedMinimumDim : curElementsDim);
657
+ }
624
658
 
625
659
  // Store the minimum dimension (height/width) before overflow
626
660
  this.cachedMinimumDim = curElementsDim + this.cachedOverflowDim;
@@ -674,7 +708,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
674
708
  v, rect,
675
709
  point;
676
710
 
677
- point = {x: x, y: y};
711
+ point = { x: x, y: y };
678
712
  for (i = 0, length = cv.length; i < length; i++) {
679
713
  v = cv[i];
680
714
 
@@ -720,25 +754,33 @@ SC.SegmentedView = SC.View.extend(SC.Control,
720
754
  event occurred.
721
755
  */
722
756
  displayItemIndexForEvent: function (evt) {
723
- var renderDelegate = this.get('renderDelegate');
724
- var x = evt.clientX;
725
- var y = evt.clientY;
726
-
727
- // Accessibility workaround: <rdar://problem/10467360> WebKit sends all event coords as 0,0 for all AXPress-triggered events
728
- if (x === 0 && y === 0) {
729
- var el = evt.target;
730
- if (el) {
757
+ var el = evt.target,
758
+ x = evt.clientX,
759
+ y = evt.clientY,
760
+ ret = -1;
761
+
762
+ if (el && el !== this.get('layer')) {
763
+ // Accessibility workaround: WebKit sends all event coords as 0,0 for all AXPress-triggered events.
764
+ // For example, triggering an element with VoiceOver in OS X.
765
+ // Note: by ensuring that the event target wasn't our own layer, we avoid the situation where an
766
+ // actual mouse clicked at 0,0 and hit only our layer.
767
+ if (x === 0 && y === 0) {
731
768
  var offset = SC.offset(el);
769
+
770
+ // Generate point coordinates in the middle of the target element.
732
771
  x = offset.x + Math.round(el.offsetWidth / 2);
733
772
  y = offset.y + Math.round(el.offsetHeight / 2);
734
773
  }
735
- }
736
774
 
737
- if (renderDelegate && renderDelegate.indexForClientPosition) {
738
- return renderDelegate.indexForClientPosition(this, x, y);
775
+ var renderDelegate = this.get('renderDelegate');
776
+ if (renderDelegate && renderDelegate.indexForClientPosition) {
777
+ ret = renderDelegate.indexForClientPosition(this, x, y);
778
+ } else {
779
+ ret = this.indexForClientPosition(x, y);
780
+ }
739
781
  }
740
782
 
741
- return this.indexForClientPosition(evt.clientX, evt.clientY);
783
+ return ret;
742
784
  },
743
785
 
744
786
  /** @private */
@@ -802,12 +844,15 @@ SC.SegmentedView = SC.View.extend(SC.Control,
802
844
 
803
845
  /** @private */
804
846
  mouseDown: function (evt) {
847
+ // Fast path, reject secondary clicks.
848
+ if (evt.which !== 1) return false;
849
+
805
850
  var childViews = this.get('childViews'),
806
851
  childView,
807
852
  overflowIndex = childViews.get('length') - 1,
808
853
  index;
809
854
 
810
- if (!this.get('isEnabledInPane')) return YES; // nothing to do
855
+ if (!this.get('isEnabledInPane')) return YES; // nothing to do // TODO: return NO?
811
856
 
812
857
  index = this.displayItemIndexForEvent(evt);
813
858
  if (index >= 0) {
@@ -818,9 +863,13 @@ SC.SegmentedView = SC.View.extend(SC.Control,
818
863
  // if mouse was pressed on the overflow segment, popup the menu
819
864
  if (index === overflowIndex) this.showOverflowMenu();
820
865
  else this._isMouseDown = YES;
821
- }
822
866
 
823
- return YES;
867
+ return YES;
868
+ }
869
+ // If this event originated outside of a segment, pass the event along up.
870
+ else {
871
+ return NO;
872
+ }
824
873
  },
825
874
 
826
875
  /** @private */
@@ -1128,11 +1177,19 @@ SC.SegmentedView = SC.View.extend(SC.Control,
1128
1177
  Presents the popup menu containing overflowed segments.
1129
1178
  */
1130
1179
  showOverflowMenu: function () {
1131
- var childViews = this.get('childViews'),
1180
+ var self = this,
1181
+ childViews = this.get('childViews'),
1182
+ itemValueKey = this.get('itemValueKey'),
1183
+ itemLayerIdKey = this.get('itemLayerIdKey'),
1132
1184
  overflowItems = this.overflowItems,
1133
1185
  overflowItemsLength,
1134
1186
  startIndex,
1135
- isArray, value;
1187
+ isArray,
1188
+ value,
1189
+ item,
1190
+ layerId,
1191
+ layer,
1192
+ overflowElement;
1136
1193
 
1137
1194
  // Check the currently selected item if it is in overflowItems
1138
1195
  overflowItemsLength = overflowItems.get('length');
@@ -1141,8 +1198,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
1141
1198
  value = this.get('value');
1142
1199
  isArray = SC.isArray(value);
1143
1200
  for (var i = 0; i < overflowItemsLength; i++) {
1144
- var item = overflowItems.objectAt(i),
1145
- itemValueKey = this.get('itemValueKey');
1201
+ item = overflowItems.objectAt(i);
1146
1202
 
1147
1203
  if (isArray ? value.indexOf(item.get(itemValueKey)) >= 0 : value === item.get(itemValueKey)) {
1148
1204
  item.set('isChecked', YES);
@@ -1152,11 +1208,17 @@ SC.SegmentedView = SC.View.extend(SC.Control,
1152
1208
 
1153
1209
  // Track the matching segment index
1154
1210
  item.set('index', startIndex + i);
1211
+
1212
+ // Add '-overflow-menu-item' to the existing layer id (if set),
1213
+ // and use that as the layer id on the menu. This prevents the original
1214
+ // segment from being removed when the menu closes.
1215
+ layerId = item.get(itemLayerIdKey);
1216
+ if (layerId) {
1217
+ item.set('overflowLayerId', layerId + '-overflow-menu-item');
1218
+ }
1155
1219
  }
1156
1220
 
1157
1221
  // TODO: we can't pass a shortcut key to the menu, because it isn't a property of SegmentedView (yet?)
1158
- var self = this;
1159
-
1160
1222
  var menu = SC.MenuPane.create({
1161
1223
  layout: { width: 200 },
1162
1224
  items: overflowItems,
@@ -1165,6 +1227,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
1165
1227
  itemIsEnabledKey: this.get('itemIsEnabledKey'),
1166
1228
  itemKeyEquivalentKey: this.get('itemKeyEquivalentKey'),
1167
1229
  itemCheckboxKey: 'isChecked',
1230
+ itemLayerIdKey: 'overflowLayerId',
1168
1231
 
1169
1232
  // We need to be able to update our overflow segment even if the user clicks outside of the menu. Since
1170
1233
  // there is no callback method or observable property when the menu closes, override modalPaneDidClick().
@@ -1179,8 +1242,8 @@ SC.SegmentedView = SC.View.extend(SC.Control,
1179
1242
  }
1180
1243
  });
1181
1244
 
1182
- var layer = this.get('layer');
1183
- var overflowElement = layer.childNodes[layer.childNodes.length - 1];
1245
+ layer = this.get('layer');
1246
+ overflowElement = layer.childNodes[layer.childNodes.length - 1];
1184
1247
  menu.popup(overflowElement);
1185
1248
 
1186
1249
  menu.addObserver("selectedItem", this, 'selectOverflowItem');
@@ -1194,7 +1257,7 @@ SC.SegmentedView = SC.View.extend(SC.Control,
1194
1257
  overflowItemsLength,
1195
1258
  childViews = this.get('childViews'),
1196
1259
  overflowIndex = Infinity,
1197
- overflowView = childViews.lastObject(),
1260
+ overflowView = this.get('overflowView'),
1198
1261
  childView;
1199
1262
 
1200
1263
  // The index where childViews are all overflowed
@@ -553,9 +553,10 @@ SC.SelectView = SC.ButtonView.extend(
553
553
 
554
554
  idx += 1;
555
555
 
556
- this.set('_itemList', itemList);
557
556
  }, this );
558
557
 
558
+ this.set('_itemList', itemList);
559
+
559
560
  var value = this.get('value');
560
561
  if (SC.none(value)) {
561
562
  if (SC.none(emptyName)) {
@@ -798,6 +799,9 @@ SC.SelectView = SC.ButtonView.extend(
798
799
  Holding down the button should display the menu pane.
799
800
  */
800
801
  mouseDown: function (evt) {
802
+ // Fast path, reject secondary clicks.
803
+ if (evt.which !== 1) return false;
804
+
801
805
  if (!this.get('isEnabledInPane')) return YES; // handled event, but do nothing
802
806
  this.set('isActive', YES);
803
807
  this._isMouseDown = YES;
@@ -872,18 +876,20 @@ SC.SelectView = SC.ButtonView.extend(
872
876
 
873
877
  /**
874
878
  @private
875
- Pressing the Up or Down arrow key should display the menu pane
879
+ Pressing the Up or Down arrow key should display the menu pane. Pressing escape should
880
+ resign first responder.
876
881
  */
877
- interpretKeyEvents: function (event) {
878
- if (event) {
879
- if ((event.keyCode === 38 || event.keyCode === 40)) {
880
- this._action();
881
- }
882
- else if (event.keyCode === 27) {
883
- this.resignFirstResponder();
884
- }
885
- }
886
- return sc_super();
882
+ moveUp: function(evt) {
883
+ this._action();
884
+ return YES;
885
+ },
886
+ /** @private */
887
+ moveDown: function(evt) {
888
+ this._action();
889
+ return YES;
890
+ },
891
+ cancel: function(evt) {
892
+ this.resignFirstResponder();
887
893
  },
888
894
 
889
895
  /** @private
@@ -7,25 +7,23 @@
7
7
 
8
8
  /** @class
9
9
 
10
- A SliderView shows a horizontal slider control that you can use to set
11
- variable values.
10
+ SliderView displays a horizontal slider control that you can use to choose
11
+ from a spectrum (or a sequence) of values.
12
12
 
13
- You can use a slider view much like you would any other control. Simply
14
- set the value or content/contentValueKey to whatever value you want to
15
- display. You can also set the maximumValue and minValue properties to
16
- determine the mapping of the control to its children.
13
+ The property `value` holds the slider's current value. You can set the
14
+ `minimum`, `maximum` and `step` properties as well.
17
15
 
18
16
  @extends SC.View
19
17
  @extends SC.Control
20
18
  @since SproutCore 1.0
21
- @test in progress
22
19
  */
23
20
  SC.SliderView = SC.View.extend(SC.Control,
24
21
  /** @scope SC.SliderView.prototype */ {
25
22
 
23
+ /** @private */
26
24
  classNames: 'sc-slider-view',
27
25
 
28
- /**
26
+ /** @private
29
27
  The WAI-ARIA role for slider view. This property's value should not be
30
28
  changed.
31
29
 
@@ -34,21 +32,22 @@ SC.SliderView = SC.View.extend(SC.Control,
34
32
  ariaRole: 'slider',
35
33
 
36
34
  /**
37
- Bind this to the current value of the progress bar. Note that by default
38
- an empty value will disable the progress bar and a multiple value too make
39
- it indeterminate.
35
+ The current value of the slider.
40
36
  */
41
37
  value: 0.50,
42
38
  valueBindingDefault: SC.Binding.single().notEmpty(),
43
39
 
44
40
  /**
45
- The minimum value of the progress.
41
+ The minimum value of the slider.
42
+
43
+ @type {Number}
44
+ @default 0
46
45
  */
47
46
  minimum: 0,
48
47
  minimumBindingDefault: SC.Binding.single().notEmpty(),
49
48
 
50
49
  /**
51
- Optionally specify the key used to extract the minimum progress value
50
+ Optionally specify the key used to extract the minimum slider value
52
51
  from the content object. If this is set to null then the minimum value
53
52
  will not be derived from the content object.
54
53
 
@@ -57,13 +56,16 @@ SC.SliderView = SC.View.extend(SC.Control,
57
56
  contentMinimumKey: null,
58
57
 
59
58
  /**
60
- The maximum value of the progress bar.
59
+ The maximum value of the slider bar.
60
+
61
+ @type {Number}
62
+ @default 1
61
63
  */
62
- maximum: 1.0,
64
+ maximum: 1,
63
65
  maximumBindingDefault: SC.Binding.single().notEmpty(),
64
66
 
65
67
  /**
66
- Optionally specify the key used to extract the maximum progress value
68
+ Optionally specify the key used to extract the maximum slider value
67
69
  from the content object. If this is set to null then the maximum value
68
70
  will not be derived from the content object.
69
71
 
@@ -75,16 +77,39 @@ SC.SliderView = SC.View.extend(SC.Control,
75
77
  Optionally set to the minimum step size allowed.
76
78
 
77
79
  All values will be rounded to this step size when displayed.
80
+
81
+ @type {Number}
82
+ @default 0.1
78
83
  */
79
84
  step: 0.1,
80
85
 
86
+ /*
87
+ When set to true, this draws and positions an element for each step, giving
88
+ your theme the opportunity to show a mark at each step.
89
+
90
+ @type {Boolean}
91
+ @default {false}
92
+ */
93
+ markSteps: false,
94
+
95
+ /*
96
+ When set to true, this view handles mouse-wheel scroll events by changing the
97
+ value. Set to false to prevent a slider in a scroll view from hijacking scroll
98
+ events mid-scroll, for example.
99
+
100
+ @type {Boolean}
101
+ @default {true}
102
+ */
103
+ updateOnScroll: true,
104
+
81
105
  // ..........................................................
82
- // INTERNAL PROPERTIES
106
+ // INTERNAL
83
107
  //
84
108
 
85
- displayProperties: ['displayValue', 'ariaValue', 'minimum', 'maximum', 'step', 'frame'],
109
+ /* @private The full list includes min, max, and stepPositions, but those are redundant with displayValue. */
110
+ displayProperties: ['displayValue', 'markSteps'],
86
111
 
87
- /**
112
+ /** @private
88
113
  @property
89
114
  The raw, unchanged value to be provided to screen readers and the like.
90
115
  */
@@ -92,14 +117,74 @@ SC.SliderView = SC.View.extend(SC.Control,
92
117
  return this.get('value');
93
118
  }.property('value').cacheable(),
94
119
 
95
- // The name of the render delegate which is creating and maintaining
96
- // the DOM associated with instances of this view
120
+ /* @private
121
+ The name of the render delegate which is creating and maintaining
122
+ the DOM associated with instances of this view.
123
+ */
97
124
  renderDelegateName: 'sliderRenderDelegate',
98
125
 
126
+ /*
127
+ The value, converted to a percent out of 100 between maximum and minimum.
128
+
129
+ @property
130
+ @readonly
131
+ */
99
132
  displayValue: function() {
133
+ return this._displayValueForValue(this.get('value'));
134
+ }.property('value', 'minimum', 'maximum', 'step').cacheable(),
135
+
136
+ /*
137
+ If a nonzero step is specified, this property contains an array of each step's value between
138
+ min and max (inclusive).
139
+
140
+ @property
141
+ @readonly
142
+ @type {Array|null}
143
+ */
144
+ steps: function() {
145
+ var step = this.get('step');
146
+ // FAST PATH: No step.
147
+ if (!step) return null;
148
+ var min = this.get('minimum'),
149
+ max = this.get('maximum'),
150
+ cur = min,
151
+ ret = [];
152
+ while (cur < max) {
153
+ ret.push(cur);
154
+ cur += step;
155
+ cur = Math.round(cur / step) * step;
156
+ }
157
+ ret.push(max);
158
+ return ret;
159
+ }.property('minimum', 'maximum', 'step').cacheable(),
160
+
161
+ /*
162
+ If a nonzero step is specified, this property contains an array of each step's position,
163
+ expressed as a fraction between 0 and 1 (inclusive). You can use these values to generate
164
+ and position labels for each step, for example.
165
+
166
+ @property
167
+ @readonly
168
+ @type {Array|null}
169
+ */
170
+ stepPositions: function() {
171
+ var steps = this.get('steps');
172
+ // FAST PATH: No steps.
173
+ if (!steps) return null;
174
+ var min = steps[0],
175
+ max = steps[steps.length - 1],
176
+ ret = [],
177
+ len = steps.length, i;
178
+ for (i = 0; i < len; i++) {
179
+ ret[i] = Math.round((steps[i] - min) / (max - min) * 1000) / 1000;
180
+ }
181
+ return ret;
182
+ }.property('steps').cacheable(),
183
+
184
+ // Given a particular value, returns the percentage value.
185
+ _displayValueForValue: function(value) {
100
186
  var min = this.get('minimum'),
101
187
  max = this.get('maximum'),
102
- value = this.get('value'),
103
188
  step = this.get('step');
104
189
 
105
190
  // determine the constrained value. Must fit within min & max
@@ -111,54 +196,95 @@ SC.SliderView = SC.View.extend(SC.Control,
111
196
  }
112
197
 
113
198
  // determine the percent across
114
- if(value!==0) value = Math.floor((value - min) / (max - min) * 100);
199
+ value = Math.round((value - min) / (max - min) * 100);
115
200
 
116
201
  return value;
117
- }.property('value', 'minimum', 'maximum', 'step').cacheable(),
202
+ },
118
203
 
204
+ /** @private Clears the mouse just down flag. */
205
+ _sc_clearMouseJustDown: function () {
206
+ this._sc_isMouseJustDown = NO;
207
+ },
208
+
209
+ /** @private Flag used to track when the mouse is pressed. */
119
210
  _isMouseDown: NO,
120
211
 
212
+ /** @private Flag used to track when mouse was just down so that mousewheel events firing as the finger is lifted don't shoot the slider over. */
213
+ _sc_isMouseJustDown: NO,
214
+
215
+ /** @private Timer used to track time immediately after a mouse up event. */
216
+ _sc_clearMouseJustDownTimer: null,
217
+
218
+ /* @private */
121
219
  mouseDown: function(evt) {
220
+ // Fast path, reject secondary clicks.
221
+ if (evt.which && evt.which !== 1) return false;
222
+
122
223
  if (!this.get('isEnabledInPane')) return YES; // nothing to do...
123
224
  this.set('isActive', YES);
124
225
  this._isMouseDown = YES ;
226
+
227
+ // Clear existing mouse just down timer.
228
+ if (this._sc_clearMouseJustDownTimer) {
229
+ this._sc_clearMouseJustDownTimer.invalidate();
230
+ this._sc_clearMouseJustDownTimer = null;
231
+ }
232
+
233
+ this._sc_isMouseJustDown = NO;
234
+
125
235
  return this._triggerHandle(evt, YES);
126
236
  },
127
237
 
128
- // mouseDragged uses same technique as mouseDown.
238
+ /* @private mouseDragged uses same technique as mouseDown. */
129
239
  mouseDragged: function(evt) {
130
240
  return this._isMouseDown ? this._triggerHandle(evt) : YES;
131
241
  },
132
242
 
133
- // remove active class
243
+ /* @private remove active class */
134
244
  mouseUp: function(evt) {
135
245
  if (this._isMouseDown) this.set('isActive', NO);
136
246
  var ret = this._isMouseDown ? this._triggerHandle(evt) : YES ;
137
247
  this._isMouseDown = NO;
248
+
249
+ // To avoid annoying jitter from Magic Mouse (which sends mousewheel events while trying
250
+ // to lift your finger after a drag), ignore mousewheel events for a small period of time.
251
+ this._sc_isMouseJustDown = YES;
252
+ this._sc_clearMouseJustDownTimer = this.invokeLater(this._sc_clearMouseJustDown, 250);
253
+
138
254
  return ret ;
139
255
  },
140
256
 
257
+ /* @private */
141
258
  mouseWheel: function(evt) {
142
- if (!this.get('isEnabledInPane')) return YES;
259
+ if (!this.get('isEnabledInPane')) return NO;
260
+ if (!this.get('updateOnScroll')) return NO;
261
+
262
+ // If the Magic Mouse is pressed, it still sends mousewheel events rapidly, we don't want errant wheel
263
+ // events to move the slider.
264
+ if (this._isMouseDown || this._sc_isMouseJustDown) return NO;
265
+
143
266
  var min = this.get('minimum'),
144
267
  max = this.get('maximum'),
145
- step = this.get('step'),
146
- newVal = this.get('value')+((evt.wheelDeltaX+evt.wheelDeltaY)*step),
147
- value = Math.round(newVal / step) * step ;
268
+ step = this.get('step') || ((max - min) / 20),
269
+ newVal = this.get('value') + ((evt.wheelDeltaX+evt.wheelDeltaY)*step),
270
+ value = Math.round(newVal / step) * step;
148
271
  if (newVal< min) this.setIfChanged('value', min);
149
272
  else if (newVal> max) this.setIfChanged('value', max);
150
273
  else this.setIfChanged('value', newVal);
151
274
  return YES ;
152
275
  },
153
276
 
277
+ /* @private */
154
278
  touchStart: function(evt){
155
279
  return this.mouseDown(evt);
156
280
  },
157
281
 
282
+ /* @private */
158
283
  touchEnd: function(evt){
159
284
  return this.mouseUp(evt);
160
285
  },
161
286
 
287
+ /* @private */
162
288
  touchesDragged: function(evt){
163
289
  return this.mouseDragged(evt);
164
290
  },
@@ -199,7 +325,7 @@ SC.SliderView = SC.View.extend(SC.Control,
199
325
 
200
326
  // convert to value using minimum/maximum then constrain to steps
201
327
  loc = min + ((max-min)*loc);
202
- if (step !== 0) loc = Math.round(loc / step) * step ;
328
+ if (!SC.none(step) && step !== 0) loc = Math.round(loc / step) * step ;
203
329
 
204
330
  // if changes by more than a rounding amount, set v.
205
331
  if (Math.abs(v-loc)>=0.01) {
@@ -209,12 +335,13 @@ SC.SliderView = SC.View.extend(SC.Control,
209
335
  return YES ;
210
336
  },
211
337
 
212
- /** tied to the isEnabledInPane state */
338
+ /** @private tied to the isEnabledInPane state */
213
339
  acceptsFirstResponder: function() {
214
340
  if (SC.FOCUS_ALL_CONTROLS) { return this.get('isEnabledInPane'); }
215
341
  return NO;
216
342
  }.property('isEnabledInPane'),
217
343
 
344
+ /* @private TODO: Update to use interpretKeyEvents. */
218
345
  keyDown: function(evt) {
219
346
  // handle tab key
220
347
  if (evt.which === 9 || evt.keyCode === 9) {
@@ -229,7 +356,7 @@ SC.SliderView = SC.View.extend(SC.Control,
229
356
  size = max-min, val=0, calculateStep, current=this.get('value');
230
357
 
231
358
  if (evt.which === 37 || evt.which === 38 || evt.which === 34 ){
232
- if(step === 0){
359
+ if (SC.none(step) || step === 0) {
233
360
  if(size<100){
234
361
  val = current-1;
235
362
  }else{
@@ -242,7 +369,7 @@ SC.SliderView = SC.View.extend(SC.Control,
242
369
  }
243
370
  }
244
371
  if (evt.which === 39 || evt.which === 40 || evt.which === 33 ){
245
- if(step === 0){
372
+ if (SC.none(step) || step === 0) {
246
373
  if(size<100){
247
374
  val = current + 2;
248
375
  }else{
@@ -268,6 +395,7 @@ SC.SliderView = SC.View.extend(SC.Control,
268
395
  return YES;
269
396
  },
270
397
 
398
+ /* @private */
271
399
  contentKeys: {
272
400
  'contentValueKey': 'value',
273
401
  'contentMinimumKey': 'minimum',