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
@@ -11,11 +11,15 @@ SC.mixin(SC.View,
11
11
 
12
12
  /**
13
13
  This child layout plugin automatically positions the view's child views in a
14
- vertical stack and optionally adjusts the parent view's height to fit. It
15
- does this by checking the height of each child view and positioning the
16
- following child view accordingly. By default any time that a child view's
17
- height changes, the view will use this plugin to re-adjust all other child
18
- views and its own height appropriately.
14
+ vertical stack and optionally adjusts the view's height to fit. It does this
15
+ by checking the height of each child view and positioning the following child
16
+ view accordingly. Afterwards, by default, any time that a child view's
17
+ height or visibility changes, the view will use this plugin to re-adjust all
18
+ following child views' positions and potentially its own height appropriately.
19
+
20
+ This allows you to stack absolutely positioned views that dynamically change
21
+ their height and/or visibility without having to resort to using browser
22
+ flow layout.
19
23
 
20
24
  A typical usage scenario is a long "form" made of multiple subsection
21
25
  views. If we want to adjust the height of a subsection, to make space for
@@ -34,27 +38,38 @@ SC.mixin(SC.View,
34
38
  // The order of child views is important!
35
39
  childViews: ['sectionA', 'sectionB', 'sectionC'],
36
40
 
37
- // Actual layout will become { left: 10, right: 10, top: 20, height: 270 }
38
- layout: { left: 10, right: 10, top: 20 }, // Don't need to specify layout.height, this is automatic.
41
+ // The view will resize itself to fit its children.
42
+ // i.e. We don't need to specify layout.height, this is automatic.
43
+ // The actual layout will become { left: 10, right: 10, top: 20, height: 270 } initially.
44
+ layout: { left: 10, right: 10, top: 20 },
39
45
 
40
46
  sectionA: SC.View.design({
41
- // Actual layout will become { left: 0, right: 0, top: 0, height: 100 }
42
- layout: { height: 100 } // Don't need to specify layout.top, this is automatic.
47
+
48
+ // We don't need to specify layout.top, this is automatic.
49
+ // The actual layout will become { left: 0, right: 0, top: 0, height: 100 } initially.
50
+ layout: { height: 100 }
51
+
43
52
  }),
44
53
 
45
54
  sectionB: SC.View.design({
46
- // Actual layout will become { border: 1, left: 0, right: 0, top: 100, height: 50 }
47
- layout: { border: 1, height: 50 } // Don't need to specify layout.top, this is automatic.
55
+
56
+ // We don't need to specify layout.top, this is automatic.
57
+ // The actual layout will become { border: 1, left: 0, right: 0, top: 100, height: 50 } initially.
58
+ layout: { border: 1, height: 50 }
59
+
48
60
  }),
49
61
 
50
62
  sectionC: SC.View.design({
51
- // Actual layout will become { left: 10, right: 10, top: 150, height: 120 }
52
- layout: { left: 10, right: 10, height: 120 } // Don't need to specify layout.top, this is automatic.
63
+
64
+ // We don't need to specify layout.top, this is automatic.
65
+ // The actual layout will become { left: 10, right: 10, top: 150, height: 120 } initially.
66
+ layout: { left: 10, right: 10, height: 120 }
67
+
53
68
  })
54
69
 
55
70
  });
56
71
 
57
- ## Modify all child view layouts with `childViewLayoutOptions`
72
+ ## Modify the default behavior with `childViewLayoutOptions`
58
73
 
59
74
  To modify the plugin behavior for all child view layouts, you can set the
60
75
  following child view layout options in `childViewLayoutOptions` on the view:
@@ -81,30 +96,44 @@ SC.mixin(SC.View,
81
96
  // The order of child views is important!
82
97
  childViews: ['sectionA', 'sectionB', 'sectionC'],
83
98
 
84
- // Actual layout will become { left: 10, right: 10, top: 20, height: 310 }
99
+ // The actual layout will become { left: 10, right: 10, top: 20, height: 310 } initially.
85
100
  layout: { left: 10, right: 10, top: 20 }, // Don't need to specify layout.height, this is automatic.
86
101
 
87
102
  sectionA: SC.View.design({
88
- // Actual layout will become { left: 0, right: 0, top: 10, height: 100 }
89
- layout: { height: 100 } // Don't need to specify layout.top, this is automatic.
103
+
104
+ // We don't need to specify layout.top, this is automatic.
105
+ // The actual layout will become { left: 0, right: 0, top: 10, height: 100 } initially.
106
+ layout: { height: 100 }
107
+
90
108
  }),
91
109
 
92
110
  sectionB: SC.View.design({
93
- // Actual layout will become { border: 1, left: 0, right: 0, top: 115, height: 50 }
94
- layout: { border: 1, height: 50 } // Don't need to specify layout.top, this is automatic.
111
+
112
+ // We don't need to specify layout.top, this is automatic.
113
+ // The actual layout will become { border: 1, left: 0, right: 0, top: 115, height: 50 } initially.
114
+ layout: { border: 1, height: 50 }
115
+
95
116
  }),
96
117
 
97
118
  sectionC: SC.View.design({
98
- // Actual layout will become { left: 10, right: 10, top: 170, height: 120 }
99
- layout: { left: 10, right: 10, height: 120 } // Don't need to specify layout.top, this is automatic.
119
+
120
+ // We don't need to specify layout.top, this is automatic.
121
+ // The actual layout will become { left: 10, right: 10, top: 170, height: 120 } initially.
122
+ layout: { left: 10, right: 10, height: 120 }
123
+
100
124
  })
101
125
 
102
126
  });
103
127
 
104
128
  If `resizeToFit` is set to `false`, the view will not adjust itself to fit
105
129
  its child views. This means that when `resizeToFit` is false, the view should
106
- specify its height component in its layout. This also means that you can
107
- ignore the last child view's layout height if you want the last child view
130
+ specify its height component in its layout. A direct effect is the possibility for
131
+ the child views to automatically extend or shrink in order to fill the empty, unclaimed space.
132
+ This available space is shared between the children not specifying a fixed height
133
+ and their final dimension is calculated proportionally to the value of the
134
+ property `fillRatio`.
135
+ For simplicity, when none of the children specifies `fillRatio`,
136
+ you can ignore the last child view's layout height if you want the last child view
108
137
  to stretch to fill the parent view.
109
138
 
110
139
  For example,
@@ -129,18 +158,37 @@ SC.mixin(SC.View,
129
158
  layout: { left: 10, right: 10, top: 20, height: 500 }, // Need to specify layout.height.
130
159
 
131
160
  sectionA: SC.View.design({
132
- // Actual layout will become { left: 0, right: 0, top: 10, height: 100 }
133
- layout: { height: 100 } // Don't need to specify layout.top, this is automatic.
161
+
162
+ // We don't need to specify layout.top, this is automatic. This child will not stretch, its height is set.
163
+ // The actual layout will become { left: 0, right: 0, top: 10, height: 100 } initially.
164
+ layout: { height: 100 }
165
+
134
166
  }),
135
167
 
136
168
  sectionB: SC.View.design({
137
- // Actual layout will become { border: 1, left: 0, right: 0, top: 115, height: 50 }
138
- layout: { border: 1, height: 50 } // Don't need to specify layout.top, this is automatic.
169
+
170
+ // The unclaimed space so far is 500 - 10 - 100 - 5 - 5 - 20, or 360px. This space will be shared between
171
+ // the two last sections, because we won't specity a height on them.
172
+ // This view will get 1/3 of the available space, because the other flexibile view has a ratio of 2.
173
+ fillRatio: 1,
174
+
175
+ // This section will take 1/3 * 360px = 120px.
176
+ // Actual layout will become { border: 1, left: 0, right: 0, top: 115, bottom: 265 }, in other words, height == 120
177
+ // We don't need to specify layout.top, layout.bottom or layout.height, this is automatic.
178
+ layout: { border: 1 }
179
+
139
180
  }),
140
181
 
141
182
  sectionC: SC.View.design({
142
- // Actual layout will become { left: 10, right: 10, top: 170, bottom: 20 }
143
- layout: { left: 10, right: 10 } // Don't need to specify layout.top, layout.bottom or layout.height, this is automatic.
183
+
184
+ // This view will get 2/3 of the available space, because the other flexibile view has a ratio of 1.
185
+ fillRatio: 2,
186
+
187
+ // This section will take 2/3 * 360px = 240px.
188
+ // Actual layout will become { left: 10, right: 10, top: 240, bottom: 20 }, in other words, height == 240
189
+ // We don't need to specify layout.top, layout.bottom or layout.height, this is automatic.
190
+ layout: { left: 10, right: 10 }
191
+
144
192
  })
145
193
 
146
194
  });
@@ -155,6 +203,7 @@ SC.mixin(SC.View,
155
203
  - useAbsoluteLayout - Don't include this child view in automatic layout, use absolute positioning based on the child view's `layout` property.
156
204
  - useStaticLayout - Don't include this child view in automatic layout. This child view uses relative positioning and is not eligible for automatic layout.
157
205
  - isVisible - Non-visible child views are not included in the stack.
206
+ - fillRatio - When the parent view is configured with a fixed dimension, children not specifying a height but specifying fillRatio will be resized to fill the unclaimed space proportionally to this ratio.
158
207
 
159
208
  For example,
160
209
 
@@ -220,6 +269,17 @@ SC.mixin(SC.View,
220
269
  /** @private Properties to observe on child views that affect the overall child view layout. */
221
270
  childLayoutProperties: ['marginBefore', 'marginAfter', 'isVisible'],
222
271
 
272
+ /** @private When resizeToFit is false, then we need to know when the view's frame changes. */
273
+ layoutDependsOnSize: function (view) {
274
+ var options = view.get('childViewLayoutOptions');
275
+
276
+ if (options) {
277
+ return SC.none(options.resizeToFit) ? false : !options.resizeToFit;
278
+ } else {
279
+ return false;
280
+ }
281
+ },
282
+
223
283
  /** @private */
224
284
  layoutChildViews: function (view) {
225
285
  var childViews = view.get('childViews'),
@@ -228,14 +288,96 @@ SC.mixin(SC.View,
228
288
  lastMargin = 0, // Used to avoid adding spacing to the final margin.
229
289
  marginAfter = options.paddingBefore || 0,
230
290
  paddingAfter = options.paddingAfter || 0,
231
- position = 0,
291
+ topPosition = 0,
292
+ provisionedSpace = 0,
293
+ autoFillAvailableSpace = 0,
294
+ totalAvailableSpace = 0,
295
+ totalFillAvailableSpaceRatio = 0,
232
296
  spacing = options.spacing || 0,
297
+ childView,
298
+ fillRatio,
299
+ layout,
300
+ marginBefore,
233
301
  i, len;
234
302
 
303
+ // if the view is not configured to resize to fit content, then we give a chance to the children to fill the available space
304
+ // we make a 1st pass to check the conditions, to evaluate the available space and the proportions between children
305
+ if (!resizeToFit) {
306
+
307
+ totalAvailableSpace = view.get('frame').height;
308
+
309
+ // if the view is not configured to resize and it doesn't have yet a height, it doesn't make sense to layout children
310
+ if (!totalAvailableSpace) {
311
+ return;
312
+ }
313
+
314
+ for (i = 0, len = childViews.get('length'); i < len; i++) {
315
+ childView = childViews.objectAt(i);
316
+
317
+ // Ignore child views with useAbsoluteLayout true, useStaticLayout true or that are not visible.
318
+ if (!childView.get('isVisible') ||
319
+ childView.get('useAbsoluteLayout') ||
320
+ childView.get('useStaticLayout')) {
321
+ continue;
322
+ }
323
+
324
+ layout = childView.get('layout');
325
+
326
+ // Determine the top margin.
327
+ marginBefore = childView.get('marginBefore') || 0;
328
+ provisionedSpace += Math.max(marginAfter, marginBefore);
329
+
330
+ // if the height is not set, let's check if is possible to resize the view
331
+ if (SC.none(layout.height)) {
332
+ fillRatio = childView.get('fillRatio');
333
+
334
+ if (!SC.none(fillRatio)) {
335
+ totalFillAvailableSpaceRatio += fillRatio;
336
+ } else {
337
+ // if none of the child views has fillRatio defined, allow the last one to stretch and fill the available space.
338
+ if (i == len - 1 && totalFillAvailableSpaceRatio === 0) {
339
+ totalFillAvailableSpaceRatio = 1;
340
+ }
341
+ //@if(debug)
342
+ // Add some developer support.
343
+ else {
344
+ // even if we don't have a height set, as last instance we accept the presence of minHeight
345
+ if (SC.none(layout.minHeight))
346
+ {
347
+ SC.warn('Developer Warning: The SC.View.VERTICAL_STACK plugin requires that each childView layout contains at least a height or has a configured fillRatio. The layout may also optionally contain left and right, left and width, right and width or centerX and width. The childView %@ has an invalid layout/fillRatio: %@'.fmt(childView, SC.stringFromLayout(layout)));
348
+ return;
349
+ }
350
+ }
351
+ //@endif
352
+ }
353
+ } else {
354
+ provisionedSpace += childView.getPath('borderFrame.height');
355
+ }
356
+
357
+ // Determine the right margin.
358
+ lastMargin = childView.get('marginAfter') || 0;
359
+ marginAfter = lastMargin || spacing;
360
+ }
361
+
362
+ // consider the end padding when calculating the provisionedSpace
363
+ if (provisionedSpace !== 0 || totalFillAvailableSpaceRatio !== 0) {
364
+ provisionedSpace += Math.max(lastMargin, paddingAfter);
365
+ }
366
+
367
+ autoFillAvailableSpace = Math.max(0, totalAvailableSpace - provisionedSpace);
368
+ }
369
+
370
+ // reset the references for the effective layout
371
+ lastMargin = 0;
372
+ marginAfter = options.paddingBefore || 0;
373
+ paddingAfter = options.paddingAfter || 0;
374
+
235
375
  for (i = 0, len = childViews.get('length'); i < len; i++) {
236
- var childView = childViews.objectAt(i),
237
- layout,
238
- marginBefore;
376
+ var height,
377
+ adjustTop,
378
+ adjustBottom;
379
+
380
+ childView = childViews.objectAt(i);
239
381
 
240
382
  // Ignore child views with useAbsoluteLayout true, useStaticLayout true or that are not visible.
241
383
  if (!childView.get('isVisible') ||
@@ -245,39 +387,83 @@ SC.mixin(SC.View,
245
387
  }
246
388
 
247
389
  layout = childView.get('layout');
390
+
248
391
  //@if(debug)
249
- // Add some developer support.
250
- if (SC.none(layout.height) && (i < len - 1 || resizeToFit)) {
251
- SC.warn('Developer Warning: The SC.View.VERTICAL_STACK plugin requires that each childView layout contains at least a height and optionally also left and right, left and width, right and width or centerX and width. The childView %@ has an invalid layout: %@'.fmt(childView, SC.stringFromLayout(layout)));
392
+ // Add some developer support. The case of !resizeToFit was already checked above
393
+ if (resizeToFit && SC.none(layout.height) && SC.none(layout.minHeight)) {
394
+ SC.warn('Developer Warning: The SC.View.VERTICAL_STACK plugin, when configured with resizeToFit, requires that each childView layout contains at least a height/minHeight and optionally also left and right, left and width, right and width or centerX and width. The childView %@ has an invalid layout: %@'.fmt(childView, SC.stringFromLayout(layout)));
252
395
  return;
253
396
  }
254
397
  //@endif
255
398
 
256
399
  // Determine the top margin.
257
400
  marginBefore = childView.get('marginBefore') || 0;
258
- position += Math.max(marginAfter, marginBefore);
401
+ topPosition += Math.max(marginAfter, marginBefore);
402
+
403
+ // Try to avoid useless adjustments top or bottom or top then bottom.
404
+ // The required adjustments will be merged into a single call
405
+ adjustTop = layout.top !== topPosition;
259
406
 
260
- if (layout.top !== position) {
261
- childView.adjust('top', position);
407
+ childView.beginPropertyChanges();
408
+ if (!resizeToFit && !layout.height) {
409
+ var bottomPosition;
410
+
411
+ fillRatio = childView.get('fillRatio');
412
+
413
+ // if the last child doesn't define fillRatio, default it to 1 as above during the 1st pass
414
+ if (i == len - 1 && SC.none(fillRatio)) {
415
+ fillRatio = 1;
416
+ }
262
417
 
263
- // Allow the last child view to stretch.
264
- if (!resizeToFit && !layout.height && !layout.bottom) {
265
- childView.adjust('bottom', paddingAfter);
418
+ // we should get here only in two cases: 1. child defines fillRatio, 2. child defines a minHeight
419
+ // if both defined, we prefer to handle fillRatio, the other case being handled below by the normal adjustment to top
420
+ if (!SC.none(fillRatio)) {
421
+ var currentAvailableSpaceRatio = (fillRatio / totalFillAvailableSpaceRatio);
422
+
423
+ // calculate the height according to fillRatio and totalFillAvailableSpaceRatio
424
+ // but set the "bottom" position so any subsequent layout is not considering the height as fixed
425
+ height = Math.ceil(autoFillAvailableSpace * currentAvailableSpaceRatio);
426
+
427
+ // INCOMPLETE: We need to flag this view as constrained and re-compute all the auto-fill amounts
428
+ // Constrain the height to the maximum height allowed.
429
+ // var maxHeight = layout.maxHeight;
430
+ // if (!SC.none(maxHeight)) {
431
+ // // Constrain the height according to maxHeight. Which frees up additional available space for further child views.
432
+ // if (height > maxHeight) {
433
+ // height = maxHeight;
434
+ // }
435
+ // }
436
+
437
+ // Determine the bottom position. If the position overflows (i.e. goes negative) because of rounding up, stop at 0.
438
+ bottomPosition = Math.max(0, totalAvailableSpace - topPosition - height);
439
+ adjustBottom = layout.bottom !== bottomPosition;
440
+
441
+ if (adjustBottom) {
442
+ childView.adjust('bottom', bottomPosition);
443
+ }
266
444
  }
267
445
  }
268
- position += childView.getPath('borderFrame.height');
269
446
 
270
- // Determine the bottom margin.
447
+ if (adjustTop) {
448
+ childView.adjust('top', topPosition);
449
+ }
450
+ childView.endPropertyChanges();
451
+
452
+ topPosition += childView.getPath('borderFrame.height');
453
+
454
+ // Determine the right margin.
271
455
  lastMargin = childView.get('marginAfter') || 0;
272
456
  marginAfter = lastMargin || spacing;
273
457
  }
274
458
 
275
- // Adjust our frame to fit as well, this ensures that scrolling works.
276
459
  // If the current size is 0 (all children are hidden), it doesn't make sense to add the padding
277
- if (position !== 0)
278
- position += Math.max(lastMargin, paddingAfter);
279
- if (resizeToFit && view.getPath('layout.height') !== position) {
280
- view.adjust('height', position);
460
+ if (topPosition !== 0) {
461
+ topPosition += Math.max(lastMargin, paddingAfter);
462
+ }
463
+
464
+ // Adjust our frame to fit as well, this ensures that scrolling works.
465
+ if (resizeToFit && view.getPath('layout.height') !== topPosition) {
466
+ view.adjust('height', topPosition);
281
467
  }
282
468
  }
283
469
 
@@ -353,8 +353,6 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
353
353
  this should be the same as the content property, but sometimes we need to
354
354
  generate something different because the content is not a regular array.
355
355
 
356
- Passing YES to the force parameter will force this value to be recomputed.
357
-
358
356
  @returns {SC.Array} observable or null
359
357
  */
360
358
  _scac_observableContent: function () {
@@ -432,6 +430,17 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
432
430
  },
433
431
 
434
432
  _scac_arrayContentWillChange: function (start, removed, added) {
433
+ // Repoint arguments if orderBy is present. (If orderBy is present, we can't be sure how any content change
434
+ // translates into an arrangedObject change without calculating the order, which is a complex, potentially
435
+ // expensive operation, so we simply invalidate everything.)
436
+ if (this.get('orderBy')) {
437
+ var len = this.get('length');
438
+ start = 0;
439
+ added = len + added - removed;
440
+ removed = len;
441
+ }
442
+
443
+ // Continue.
435
444
  this.arrayContentWillChange(start, removed, added);
436
445
  if (this._kvo_enumerable_property_chains) {
437
446
  var removedObjects = this.slice(start, start + removed);
@@ -441,16 +450,20 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
441
450
 
442
451
  _scac_arrayContentDidChange: function (start, removed, added) {
443
452
  this._scac_cached = NO;
444
- this.arrayContentDidChange(start, removed, added);
445
453
 
446
- // If the start & length are provided, we can also indicate if the firstObject
447
- // or lastObject properties changed, thus making them independently observable.
448
- if (!SC.none(start)) {
449
- if (start === 0) this.notifyPropertyChange('firstObject');
450
- var length = added + removed;
451
- if (!SC.none(length) && start + length >= this.get('length') - 1) this.notifyPropertyChange('lastObject');
454
+ // Repoint arguments if orderBy is present. (If orderBy is present, we can't be sure how any content change
455
+ // translates into an arrangedObject change without calculating the order, which is a complex, potentially
456
+ // expensive operation, so we simply invalidate everything.)
457
+ if (this.get('orderBy')) {
458
+ var len = this.get('length');
459
+ start = 0;
460
+ added = len + added - removed;
461
+ removed = len;
452
462
  }
453
463
 
464
+ // Notify range, firstObject, lastObject and '[]' observers.
465
+ this.arrayContentDidChange(start, removed, added);
466
+
454
467
  if (this._kvo_enumerable_property_chains) {
455
468
  var addedObjects = this.slice(start, start + added);
456
469
  this.setupEnumerablePropertyChains(addedObjects);
@@ -532,7 +545,6 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
532
545
  this._scac_contentStatusDidChange();
533
546
 
534
547
  this.arrayContentDidChange(0, 0, newlen);
535
- this.enumerableContentDidChange(0, newlen - 1);
536
548
  this.updateSelectionAfterContentChange();
537
549
  }.observes('content'),
538
550
 
@@ -549,14 +561,12 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
549
561
  oldlen = this._scac_length;
550
562
 
551
563
  this._scac_length = newlen;
552
- this.beginPropertyChanges();
553
564
  this._scac_cached = NO; // invalidate
554
565
  // If this is an unordered enumerable, we have no way
555
566
  // of knowing which indices changed. Instead, we just
556
567
  // invalidate the whole array.
568
+ this.arrayContentWillChange(0, oldlen, newlen);
557
569
  this.arrayContentDidChange(0, oldlen, newlen);
558
- this.enumerableContentDidChange(0, oldlen - 1);
559
- this.endPropertyChanges();
560
570
  this.updateSelectionAfterContentChange();
561
571
  }.observes('orderBy'),
562
572