sproutcore 1.7.1.beta → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (445) hide show
  1. data/CHANGELOG +44 -0
  2. data/README.rdoc +20 -20
  3. data/VERSION.yml +3 -3
  4. data/lib/Buildfile +1 -1
  5. data/lib/buildtasks/build.rake +5 -0
  6. data/lib/buildtasks/manifest.rake +19 -1
  7. data/lib/frameworks/sproutcore/Buildfile +19 -17
  8. data/lib/frameworks/sproutcore/CHANGELOG.md +163 -29
  9. data/lib/frameworks/sproutcore/README.md +29 -8
  10. data/lib/frameworks/sproutcore/apps/statechart_routing/Buildfile +12 -0
  11. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/login_controller.js +11 -0
  12. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/main_controller.js +7 -0
  13. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/statechart_controller.js +17 -0
  14. data/lib/frameworks/sproutcore/apps/statechart_routing/core.js +25 -0
  15. data/lib/frameworks/sproutcore/apps/statechart_routing/main.js +15 -0
  16. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/_theme.css +18 -0
  17. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/bar_page.js +14 -0
  18. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/foo_page.js +14 -0
  19. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/loading.rhtml +9 -0
  20. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/login_page.js +61 -0
  21. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/main_page.js +46 -0
  22. data/lib/frameworks/sproutcore/apps/statechart_routing/statechart.js +76 -0
  23. data/lib/frameworks/sproutcore/apps/statechart_routing/theme.js +27 -0
  24. data/lib/frameworks/sproutcore/apps/tests/controllers/targets.js +1 -1
  25. data/lib/frameworks/sproutcore/apps/tests/states/no_targets.js +1 -1
  26. data/lib/frameworks/sproutcore/apps/tests/states/ready_detail.js +1 -1
  27. data/lib/frameworks/sproutcore/apps/tests/states/ready_empty.js +1 -1
  28. data/lib/frameworks/sproutcore/apps/tests/states/ready_list.js +1 -1
  29. data/lib/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +1 -1
  30. data/lib/frameworks/sproutcore/apps/welcome/controllers/targets.js +1 -1
  31. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +14 -1
  32. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +15 -15
  33. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +1 -1
  34. data/lib/frameworks/sproutcore/frameworks/animation/core.js +8 -5
  35. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +302 -70
  36. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +19 -14
  37. data/lib/frameworks/sproutcore/frameworks/bootstrap/tests/system/browser.js +471 -149
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +3 -3
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +42 -0
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/run_loop.js +3 -2
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +2 -2
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +3 -3
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/body_overflow.js +63 -0
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +1 -1
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +37 -2
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +28 -6
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +10 -3
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/sparse_array_delegate.js +2 -2
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +66 -2
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/builder.js +1 -1
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/cursor.js +1 -1
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +58 -57
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js.orig +445 -0
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +51 -31
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/ready.js +5 -1
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +53 -69
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/responder.js +1 -1
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +98 -72
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +37 -3
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/timer.js +7 -4
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +21 -0
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +7 -7
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +23 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/browser.js +66 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/event.js +22 -0
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/locale.js +11 -11
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/end.js +4 -4
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +41 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_className.js +1 -1
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +8 -8
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/update.js +17 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/selection_set/remove.js +1 -1
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +1 -1
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +15 -0
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +5 -5
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +50 -30
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/acceleration.js +46 -0
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +1 -43
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +8 -34
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +3 -2
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +10 -1
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +6 -5
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +22 -2
  88. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +2 -2
  89. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +1 -1
  90. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +0 -2
  91. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +35 -0
  92. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +46 -19
  93. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +23 -9
  94. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +2 -3
  95. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +1 -1
  96. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +2 -2
  97. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +294 -302
  98. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js.orig +1531 -0
  99. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +4 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +14 -11
  101. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/many_array.js +63 -0
  102. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +1 -1
  103. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +4 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +50 -10
  105. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +4 -4
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +3 -3
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +1 -1
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +1 -1
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +114 -67
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +1 -1
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +1 -1
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +54 -1
  114. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +29 -9
  115. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +1 -1
  116. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +1 -1
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +1 -1
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +1 -1
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +37 -45
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +127 -127
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +16 -0
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +42 -4
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +1 -1
  125. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -7
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +8 -0
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/resources/strings.js +2 -1
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +1 -0
  129. data/lib/frameworks/sproutcore/frameworks/debug/core.js +3 -3
  130. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +1 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +1 -1
  132. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +1 -1
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +1 -4
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +19 -6
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +30 -1
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  137. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +24 -1
  138. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +121 -28
  139. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +15 -15
  140. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +1 -1
  141. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -2
  142. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +2 -2
  143. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +39 -15
  144. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +3 -3
  145. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +2 -2
  147. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +14 -6
  148. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/popup_button.js +3 -3
  149. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +11 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +4 -3
  151. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -51
  152. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +11 -16
  153. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-error-48.png +0 -0
  154. data/lib/frameworks/sproutcore/frameworks/desktop/resources/slider.css +0 -2
  155. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +3 -3
  156. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +3 -3
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +9 -9
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/content.js +11 -11
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +1 -1
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +107 -81
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +3 -3
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +68 -60
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +57 -12
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +21 -19
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +2 -2
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +32 -3
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +12 -0
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +12 -0
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +0 -8
  172. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +77 -132
  173. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +5 -6
  174. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +16 -15
  175. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +52 -52
  176. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +1 -1
  177. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +1 -1
  178. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +147 -147
  179. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +11 -2
  180. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +2 -2
  181. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -5
  182. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +22 -12
  183. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +13 -7
  184. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +2 -2
  185. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +462 -441
  186. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +48 -62
  187. data/lib/frameworks/sproutcore/frameworks/desktop/views/segment.js +22 -2
  188. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +150 -32
  189. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +104 -45
  190. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +42 -20
  191. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +24 -24
  192. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +148 -154
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +2 -2
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +2 -2
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +8 -7
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +2 -2
  197. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  198. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/files.js +1 -1
  199. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/library.js +1 -1
  200. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/targets.js +1 -1
  201. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/view_configs.js +1 -1
  202. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/mixins/drop_down.js +1 -1
  203. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/states/ready.js +1 -1
  204. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/plist_item.js +1 -1
  205. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/web.js +1 -1
  206. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/controllers/page_design.js +2 -2
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/css/css_style_sheet.js +2 -2
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/object_designer.js +1 -1
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +2 -2
  210. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/mixins/snap_lines.js +3 -3
  211. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/designer_drop_target.js +1 -1
  212. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/drawing.js +21 -21
  213. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/page_item_view.js +1 -1
  214. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +59 -53
  215. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +2 -2
  216. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/tests/models/polymorphism/simple.js +1 -1
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +6 -6
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +2 -2
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +2 -2
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +17 -6
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +38 -14
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +5 -13
  224. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +1 -1
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +5 -3
  226. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/children.js +19 -0
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/methods.js +20 -2
  228. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/split_thumb.js +1 -1
  229. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +35 -12
  230. data/lib/frameworks/sproutcore/frameworks/formatters/README +6 -0
  231. data/lib/frameworks/sproutcore/frameworks/formatters/english.lproj/strings.js +174 -0
  232. data/lib/frameworks/sproutcore/frameworks/formatters/formatters/date_formatter.js +351 -0
  233. data/lib/frameworks/sproutcore/frameworks/formatters/tests/date_formatter.js +517 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +1 -1
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +345 -138
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +5 -3
  237. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +176 -42
  238. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +137 -105
  240. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gestureable.js +2 -2
  241. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +2 -2
  242. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +16 -1
  243. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +1 -1
  244. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +47 -47
  245. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +3 -3
  246. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +1 -1
  247. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +28 -6
  248. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +1 -1
  249. data/lib/frameworks/sproutcore/frameworks/foundation/resources/benchmark.css +0 -5
  250. data/lib/frameworks/sproutcore/frameworks/foundation/resources/bootstrap.rhtml +34 -19
  251. data/lib/frameworks/sproutcore/frameworks/foundation/resources/button_view.css +0 -2
  252. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +1 -5
  253. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +8 -9
  254. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +2 -2
  255. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +179 -47
  256. data/lib/frameworks/sproutcore/frameworks/foundation/system/task_queue.js +34 -1
  257. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +1 -1
  258. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +26 -12
  259. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/misc.js +7 -7
  260. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +12 -4
  261. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_metric_optimization.js +202 -0
  262. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/content_value_support/content.js +77 -8
  263. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +1 -0
  264. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/beginEditing.js +2 -2
  265. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/commitEditing.js +4 -3
  266. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/discardEditing.js +4 -2
  267. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/beginEditing.js +2 -2
  268. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/commitEditing.js +4 -2
  269. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/discardEditing.js +4 -2
  270. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/pointInElement.js +2 -2
  271. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +0 -8
  272. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +163 -149
  273. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +1 -1
  274. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +1 -1
  275. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
  276. data/lib/frameworks/sproutcore/frameworks/foundation/validators/password.js +1 -1
  277. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +3 -3
  278. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +16 -43
  279. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -3
  280. data/lib/frameworks/sproutcore/frameworks/foundation/views/inline_text_field.js +67 -54
  281. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +49 -38
  282. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +285 -242
  283. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +13 -13
  284. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffered.js +19 -22
  285. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-sc.js +9 -3
  286. data/lib/frameworks/sproutcore/frameworks/jquery/jquery.js +231 -186
  287. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +145 -143
  288. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +156 -154
  289. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.js +5 -5
  290. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +3 -3
  291. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js.orig +540 -0
  292. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +2 -2
  293. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +15 -8
  294. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +5 -5
  295. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +12 -0
  296. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +2 -2
  297. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +1 -1
  298. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +1 -1
  299. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +7 -7
  300. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +98 -32
  301. data/lib/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +7 -2
  302. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +14 -3
  303. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +98 -13
  304. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +8 -14
  305. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
  306. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +2 -2
  307. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +23 -6
  308. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +69 -18
  309. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +57 -31
  310. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +189 -14
  311. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +82 -22
  312. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/chained.js +20 -0
  313. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +125 -4
  314. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue.js +1 -1
  315. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +2 -2
  316. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +37 -0
  317. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +2 -2
  318. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +16 -0
  319. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +75 -4
  320. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +41 -0
  321. data/lib/frameworks/sproutcore/frameworks/statechart/mixins/statechart_delegate.js +113 -0
  322. data/lib/frameworks/sproutcore/frameworks/statechart/private/state_path_matcher.js +312 -0
  323. data/lib/frameworks/sproutcore/frameworks/statechart/system/async.js +18 -22
  324. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +508 -131
  325. data/lib/frameworks/sproutcore/frameworks/statechart/system/state_route_handler_context.js +78 -0
  326. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +265 -44
  327. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/basic/with_concurrent_states.js +16 -0
  328. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/responder_chain.js +11 -3
  329. data/lib/frameworks/sproutcore/frameworks/statechart/tests/private/state_path_matcher.js +116 -0
  330. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/add_substate.js +108 -0
  331. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/with_concurrent.js +179 -0
  332. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/without_concurrent.js +74 -0
  333. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_state.js +141 -0
  334. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_substate.js +340 -0
  335. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/route_triggered.js +161 -0
  336. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/try_to_handle_event.js +288 -0
  337. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/history_state/standard/without_concurrent_states/context.js +5 -33
  338. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/with_concurrent_states/basic.js +213 -0
  339. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/without_concurrent_states/basic.js +212 -0
  340. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/without_concurrent_states/core.js +8 -0
  341. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{state/namespacing.js → statechart/methods/get_state.js} +3 -41
  342. data/lib/frameworks/sproutcore/frameworks/statechart/tests/statechart/{invoke_state_method.js → methods/invoke_state_method.js} +1 -1
  343. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{event_handling/advanced → statechart}/respond_to_event.js +1 -1
  344. data/lib/frameworks/sproutcore/frameworks/statechart/tests/system/state_route_handler_context/methods/retry.js +64 -0
  345. data/lib/frameworks/sproutcore/frameworks/table/core.js +2 -0
  346. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/controls/button.js +0 -1
  347. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars.js +29 -5
  348. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/bind.js +4 -3
  349. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/collection.js +0 -0
  350. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/localization.js +0 -0
  351. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/view.js +0 -0
  352. data/lib/frameworks/sproutcore/frameworks/{handlebars → template_view}/handlebars.js +493 -357
  353. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/checkbox_support.js +0 -0
  354. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/text_field_support.js +13 -2
  355. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/panes/template.js +0 -0
  356. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/controls/button.js +0 -0
  357. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/checkbox_support.js +0 -0
  358. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/text_field_support.js +0 -0
  359. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/panes/template.js +0 -0
  360. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/collection.js +39 -14
  361. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/core.js +0 -0
  362. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/handlebars.js +57 -6
  363. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/bindable_span.js +21 -6
  364. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template.js +9 -3
  365. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template_collection.js +55 -26
  366. data/lib/frameworks/sproutcore/frameworks/testing/system/equiv.js +1 -1
  367. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +122 -122
  368. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +2 -2
  369. data/lib/frameworks/sproutcore/frameworks/testing/system/suite.js +4 -4
  370. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +1 -1
  371. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/reset.css +0 -1
  372. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/view.css +4 -4
  373. data/lib/frameworks/sproutcore/lib/index.rhtml +55 -32
  374. data/lib/frameworks/sproutcore/license.js +2 -4
  375. data/lib/frameworks/sproutcore/themes/ace/resources/body.css +5 -1
  376. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +2 -2
  377. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/24px/button.css +21 -13
  378. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/30px/button.css +17 -10
  379. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +4 -3
  380. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/24px/button.css +20 -12
  381. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/30px/button.css +16 -8
  382. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/jumbo/button.css +17 -0
  383. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/small/button.css +17 -0
  384. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +2 -2
  385. data/lib/frameworks/sproutcore/themes/ace/resources/master-detail/master-detail.css +2 -2
  386. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +5 -3
  387. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +1 -1
  388. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/toolbar.css +1 -1
  389. data/lib/gen/app/USAGE +17 -4
  390. data/lib/gen/language/Buildfile +4 -4
  391. data/lib/gen/language/USAGE +4 -4
  392. data/lib/gen/page/templates/pages/@target_name@/Buildfile +7 -7
  393. data/lib/gen/{html_app → statechart_app}/Buildfile +0 -0
  394. data/lib/gen/{html_app → statechart_app}/README +0 -0
  395. data/lib/gen/statechart_app/USAGE +21 -0
  396. data/lib/gen/statechart_app/templates/apps/@target_name@/Buildfile +9 -0
  397. data/lib/gen/statechart_app/templates/apps/@target_name@/core.js +24 -0
  398. data/lib/gen/statechart_app/templates/apps/@target_name@/main.js +26 -0
  399. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/_theme.css +18 -0
  400. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/loading.rhtml +9 -0
  401. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/main_page.js +21 -0
  402. data/lib/gen/statechart_app/templates/apps/@target_name@/statechart.js +8 -0
  403. data/lib/gen/statechart_app/templates/apps/@target_name@/states/ready_state.js +12 -0
  404. data/lib/gen/statechart_app/templates/apps/@target_name@/theme.js +24 -0
  405. data/lib/sproutcore/builders.rb +1 -0
  406. data/lib/sproutcore/builders/base.rb +19 -1
  407. data/lib/sproutcore/builders/chance_file.rb +6 -1
  408. data/lib/sproutcore/builders/handlebars.rb +1 -9
  409. data/lib/sproutcore/builders/javascript.rb +1 -10
  410. data/lib/sproutcore/builders/json.rb +25 -0
  411. data/lib/sproutcore/builders/less.rb +1 -1
  412. data/lib/sproutcore/builders/sass.rb +1 -1
  413. data/lib/sproutcore/builders/stylesheet.rb +1 -9
  414. data/lib/sproutcore/helpers/html5_manifest.rb +1 -1
  415. data/lib/sproutcore/helpers/static_helper.rb +42 -0
  416. data/lib/sproutcore/rack/proxy.rb +21 -3
  417. data/lib/sproutcore/rack/service.rb +3 -2
  418. data/lib/sproutcore/tools.rb +18 -25
  419. data/lib/sproutcore/tools/gen.rb +10 -3
  420. data/lib/sproutcore/tools/init.rb +11 -10
  421. data/spec/buildtasks/manifest/prepare_build_tasks/json_spec.rb +62 -0
  422. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -1
  423. data/spec/fixtures/builder_tests/apps/json_test/sc_static.json +2 -0
  424. data/spec/lib/builders/json_spec.rb +53 -0
  425. data/sproutcore.gemspec +2 -2
  426. data/vendor/chance/lib/chance/parser.rb +1 -1
  427. metadata +222 -177
  428. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/datetime.js +0 -0
  429. data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +0 -259
  430. data/lib/frameworks/sproutcore/frameworks/documentation/core.js +0 -0
  431. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +0 -69
  432. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +0 -44
  433. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +0 -64
  434. data/lib/frameworks/sproutcore/frameworks/mini/license.js +0 -30
  435. data/lib/gen/html_app/USAGE +0 -15
  436. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +0 -11
  437. data/lib/gen/html_app/templates/apps/@target_name@/resources/images/.gitkeep +0 -0
  438. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +0 -6
  439. data/lib/gen/html_app/templates/apps/@target_name@/resources/templates/@target_name@.handlebars +0 -1
  440. data/lib/gen/html_project/Buildfile +0 -45
  441. data/lib/gen/html_project/INIT +0 -3
  442. data/lib/gen/html_project/README +0 -1
  443. data/lib/gen/html_project/USAGE +0 -2
  444. data/lib/gen/html_project/templates/@filename@/Buildfile +0 -5
  445. data/lib/gen/html_project/templates/@filename@/README +0 -4
@@ -5,7 +5,9 @@
5
5
  // License: Licensed under MIT license (see license.js)
6
6
  // ==========================================================================
7
7
 
8
- SC.Button.initMixin = function(){
9
- throw "SC.Button is deprecated as a mixin and is now a subclass of SC.TemplateView. Subclass SC.ButtonView instead.";
10
- };
8
+ if(SC.Button) {
9
+ SC.Button.initMixin = function(){
10
+ throw "SC.Button is deprecated as a mixin and is now a subclass of SC.TemplateView. Subclass SC.ButtonView instead.";
11
+ };
12
+ }
11
13
 
@@ -24,7 +24,6 @@
24
24
  only have primitive values, consider using SC.Control instead.
25
25
  */
26
26
  SC.ContentValueSupport = {
27
-
28
27
  /**
29
28
  Walk like a duck.
30
29
 
@@ -35,7 +34,8 @@ SC.ContentValueSupport = {
35
34
 
36
35
  /** @private */
37
36
  initMixin: function() {
38
- this._control_contentDidChange() ; // setup content observing if needed.
37
+ // setup content observing if needed.
38
+ this._control_contentKeysDidChange();
39
39
  },
40
40
 
41
41
  /**
@@ -76,6 +76,22 @@ SC.ContentValueSupport = {
76
76
  @default null
77
77
  */
78
78
  content: null,
79
+
80
+ /**
81
+ Keys that should be observed on the content object and mapped to values on
82
+ this object. Should be a hash of local keys that point to keys on the content to
83
+ map to local values. For example, the default is {'contentValueKey': 'value'}.
84
+ This means that the value of this.contentValueKey will be observed as a key on
85
+ the content object and its value will be mapped to this.value.
86
+
87
+ @type Hash
88
+ @default null
89
+ */
90
+ contentKeys: null,
91
+
92
+ _default_contentKeys: {
93
+ contentValueKey: 'value'
94
+ },
79
95
 
80
96
  /**
81
97
  The property on the content object that would want to represent the
@@ -105,9 +121,21 @@ SC.ContentValueSupport = {
105
121
  @test in content
106
122
  */
107
123
  contentPropertyDidChange: function(target, key) {
108
- return this.updatePropertyFromContent('value', key, 'contentValueKey', target);
124
+ var contentKeys = this.get('contentKeys');
125
+
126
+ if(contentKeys) {
127
+ var contentKey;
128
+
129
+ for(contentKey in contentKeys) {
130
+ if(key === '*' || key === this.getDelegateProperty(contentKey, this, this.get('displayDelegate'), contentKeys)) return this.updatePropertyFromContent(contentKeys[contentKey], key, contentKey, target);
131
+ }
132
+ }
133
+
134
+ else {
135
+ return this.updatePropertyFromContent('value', key, 'contentValueKey', target);
136
+ }
109
137
  },
110
-
138
+
111
139
  /**
112
140
  Helper method you can use from your own implementation of
113
141
  contentPropertyDidChange(). This method will look up the content key to
@@ -124,24 +152,24 @@ SC.ContentValueSupport = {
124
152
  */
125
153
  updatePropertyFromContent: function(prop, key, contentKey, content) {
126
154
  var del, v;
127
-
155
+
128
156
  if (contentKey === undefined) contentKey = "content"+prop.capitalize()+"Key";
129
157
 
130
158
  // prefer our own definition of contentKey
131
159
  if(this[contentKey]) contentKey = this.get(contentKey);
132
160
  // if we don't have one defined check the delegate
133
- else if((del = this.displayDelegate) && (v = del[contentKey])) contentKey = del.get ? del.get(contentKey) : v;
161
+ else if((del = this.get('displayDelegate')) && (v = del[contentKey])) contentKey = del.get ? del.get(contentKey) : v;
134
162
  // if we have no key we can't do anything so just short circuit out
135
163
  else return this;
136
-
164
+
137
165
  // only bother setting value if the observer triggered for the correct key
138
166
  if (key === '*' || key === contentKey) {
139
167
  if (content === undefined) content = this.get('content');
140
168
 
141
169
  if(content) v = content.get ? content.get(contentKey) : content[contentKey];
142
170
  else v = null;
143
-
144
- this.set(prop, v) ;
171
+
172
+ this.setIfChanged(prop, v) ;
145
173
  }
146
174
 
147
175
  return this ;
@@ -162,66 +190,172 @@ SC.ContentValueSupport = {
162
190
 
163
191
  @returns {void}
164
192
  */
165
- updateContentWithValueObserver: function() {
166
- var key = this.contentValueKey ?
167
- this.get('contentValueKey') :
168
- this.getDelegateProperty('contentValueKey', this.displayDelegate),
169
- content = this.get('content');
193
+ updateContentWithValueObserver: function(target, key) {
194
+ var reverseContentKeys = this._reverseContentKeys;
170
195
 
171
- if (!key || !content) return ; // do nothing if disabled
196
+ // if everything changed, iterate through and update them all
197
+ if(!key || key === '*') {
198
+ for(key in reverseContentKeys) {
199
+ this.updateContentWithValueObserver(this, key);
200
+ }
201
+ }
172
202
 
173
203
  // get value -- set on content if changed
174
- var value = this.get('value');
204
+ var value = this.get(key);
205
+
206
+ var content = this.get('content'),
207
+ // get the key we should be setting on content, asking displayDelegate if
208
+ // necessary
209
+ contentKey = this.getDelegateProperty(reverseContentKeys[key], this, this.displayDelegate);
210
+
211
+ // do nothing if disabled
212
+ if (!contentKey || !content) return this;
175
213
 
176
214
  if (typeof content.setIfChanged === SC.T_FUNCTION) {
177
- content.setIfChanged(key, value);
215
+ content.setIfChanged(contentKey, value);
178
216
  }
179
217
 
180
218
  // avoid re-writing inherited props
181
- else if (content[key] !== value) {
182
- content[key] = value ;
219
+ else if (content[contentKey] !== value) {
220
+ content[contentKey] = value ;
183
221
  }
184
- }.observes('value'),
185
-
222
+ },
223
+
186
224
  /** @private
187
225
  This should be null so that if content is also null, the
188
226
  _contentDidChange won't do anything on init.
189
227
  */
190
228
  _control_content: null,
229
+ _old_contentValueKeys: null,
230
+ _old_contentKeys: null,
191
231
 
192
232
  /** @private
193
233
  Observes when a content object has changed and handles notifying
194
234
  changes to the value of the content object.
235
+
236
+ Optimized for the default case of only observing contentValueKey. If you use
237
+ a custom value for contentKeys it will switch to using a CoreSet to track
238
+ observed keys.
195
239
  */
196
- // TODO: observing * is unnecessary and inefficient, but a bunch of stuff in sproutcore depends on it (like button)
197
- _control_contentDidChange: function() {
198
- var content = this.get('content');
199
-
200
- if (this._control_content === content) return; // nothing changed
201
-
202
- var f = this.contentPropertyDidChange,
240
+ _control_contentDidChange: function(target, key) {
241
+ var content = this.get('content'),
242
+ contentKeys = this.get('contentKeys'), contentKey,
243
+ old = this._control_content,
244
+ oldKeys = this._old_contentValueKeys,
245
+ oldType = SC.typeOf(oldKeys),
246
+ f = this.contentPropertyDidChange;
247
+
203
248
  // remove an observer from the old content if necessary
204
- old = this._control_content;
249
+ if (old && old.removeObserver && oldKeys) {
250
+ // default case
251
+ if(oldType === SC.T_STRING) {
252
+ old.removeObserver(oldKeys, this, f);
253
+
254
+ oldKeys = null;
255
+ }
256
+
257
+ // set case
258
+ else {
259
+ var i, len = oldKeys.get('length');
260
+
261
+ for(i = 0; i < len; i++) {
262
+ contentKey = oldKeys[i];
263
+
264
+ old.removeObserver(contentKey, this, f);
265
+ }
266
+
267
+ oldKeys.clear();
268
+ }
269
+ }
270
+
271
+ // add observer to new content if necessary.
272
+ if (content && content.addObserver) {
273
+ // set case
274
+ if(contentKeys) {
275
+ // lazily create the key set
276
+ if(!oldKeys) oldKeys = SC.CoreSet.create();
277
+
278
+ // add observers to each key
279
+ for(contentKey in contentKeys) {
280
+ contentKey = this.getDelegateProperty(contentKey, this, this.get('displayDelegate'));
281
+
282
+ if(contentKey) {
283
+ content.addObserver(contentKey, this, f);
284
+
285
+ oldKeys.add(contentKey);
286
+ }
287
+ }
288
+ }
289
+
290
+ // default case hardcoded for contentValueKey
291
+ else {
292
+ contentKey = this.getDelegateProperty('contentValueKey', this, this.get('displayDelegate'));
293
+
294
+ if(contentKey) {
295
+ content.addObserver(contentKey, this, f);
296
+
297
+ // if we had a set before, continue using it
298
+ if(oldKeys) oldKeys.add(contentKey);
299
+ // otherwise just use a string
300
+ else oldKeys = contentKey;
301
+ }
302
+ }
303
+ }
205
304
 
206
- if (old && old.removeObserver) old.removeObserver('*', this, f) ;
207
-
208
305
  // update previous values
209
306
  this._control_content = content ;
210
-
211
- // add observer to new content if necessary.
212
- if (content && content.addObserver) content.addObserver('*', this, f) ;
307
+ this._old_contentValueKeys = oldKeys;
213
308
 
214
309
  // notify that value did change.
215
- this.contentPropertyDidChange(content, '*') ;
216
-
310
+ key = (!key || key === 'content') ? '*' : this.get(key);
311
+ if(key) this.contentPropertyDidChange(content, key) ;
217
312
  }.observes('content'),
218
-
313
+
314
+ // holds the previous value of contentKeys
315
+ _old_contentKeys: null,
316
+
219
317
  /** @private
220
- Since we always observe *, just call the update function
318
+ Observes changes to contentKeys and sets up observers on the local keys to
319
+ update the observers on the content object.
221
320
  */
222
- _control_contentValueKeyDidChange: function() {
223
- // notify that value did change.
224
- this.contentPropertyDidChange(this.get('content'), '*') ;
225
- }.observes('contentValueKey')
321
+ _control_contentKeysDidChange: function() {
322
+ var key, reverse = {},
323
+ // if no hash is present, use the default contentValueKey -> value
324
+ contentKeys = this.get('contentKeys') || this._default_contentKeys, contentKey,
325
+ oldContentKeys = this._old_contentKeys,
326
+ f = this._control_contentDidChange,
327
+ reverseF = this.updateContentWithValueObserver;
328
+
329
+ // remove old observers
330
+ for(key in oldContentKeys) {
331
+ contentKey = oldContentKeys[key];
332
+
333
+ this.removeObserver(contentKey, this, reverseF);
334
+
335
+ this.removeObserver(key, this, f);
336
+ }
337
+
338
+ // add new observers
339
+ for(key in contentKeys) {
340
+ contentKey = contentKeys[key];
341
+
342
+ // build reverse mapping to update content with value
343
+ reverse[contentKey] = key;
344
+
345
+ // add value observer
346
+ this.addObserver(contentKey, this, reverseF);
347
+
348
+ // add content key observer
349
+ this.addObserver(key, this, f);
350
+ }
351
+
352
+ // store reverse map for later use
353
+ this._reverseContentKeys = reverse;
354
+
355
+ this._old_contentKeys = contentKeys;
356
+
357
+ // call the other observer now to update all the observers
358
+ this._control_contentDidChange();
359
+ }.observes('contentKeys')
226
360
  };
227
361
 
@@ -135,7 +135,7 @@ SC.Editable = {
135
135
  changes.
136
136
 
137
137
  If this method is called on a view that is not currently editing, you
138
- should always just reutrn YES.
138
+ should always just return YES.
139
139
 
140
140
  The default implementation sets isEditing to NO, resigns first responder
141
141
  and returns YES.
@@ -41,7 +41,7 @@ SC.ALIGN_JUSTIFY = "justify";
41
41
  @since SproutCore 1.0
42
42
  */
43
43
  SC.FlowedLayout = {
44
-
44
+ isFlowedLayout: YES,
45
45
  /**
46
46
  The direction of flow. Possible values:
47
47
 
@@ -133,27 +133,27 @@ SC.FlowedLayout = {
133
133
  return ret;
134
134
  }.property('flowPadding').cacheable(),
135
135
 
136
- concatenatedProperties: ["childMixins"],
136
+ concatenatedProperties: ['childMixins'],
137
137
 
138
138
  /** @private */
139
139
  initMixin: function() {
140
- this.invokeOnce("_scfl_tile");
140
+ this._scfl_tileOnce();
141
141
  },
142
142
 
143
143
  /** @private
144
144
  Detects when the child views change.
145
145
  */
146
146
  _scfl_childViewsDidChange: function(c) {
147
- this.invokeOnce("_scfl_tile");
148
- }.observes("childViews"),
147
+ this._scfl_tileOnce();
148
+ }.observes('childViews'),
149
149
 
150
150
  /** @private */
151
- _scfl_layoutPropertyDidChange: function(){
152
- this.invokeOnce("_scfl_tile");
153
- }.observes('layoutDirection', 'align', 'flowPadding', 'canWrap', 'defaultFlowSpacing'),
151
+ _scfl_layoutPropertyDidChange: function(childView) {
152
+ this._scfl_tileOnce();
153
+ }.observes('layoutDirection', 'align', 'flowPadding', 'canWrap', 'defaultFlowSpacing', 'isVisibleInWindow'),
154
154
 
155
155
  /** @private
156
- Overriden to only update if it is a view we do not manage, or the width or height has changed
156
+ Overridden to only update if it is a view we do not manage, or the width or height has changed
157
157
  since our last record of it.
158
158
  */
159
159
  layoutDidChangeFor: function(c) {
@@ -177,7 +177,7 @@ SC.FlowedLayout = {
177
177
  }
178
178
 
179
179
  // nothing has changed. This is where we do something
180
- this.invokeOnce("_scfl_tile");
180
+ this._scfl_tileOnce();
181
181
  sc_super();
182
182
  },
183
183
 
@@ -192,15 +192,16 @@ SC.FlowedLayout = {
192
192
  observeChildLayout: function(c) {
193
193
  if (c._scfl_isBeingObserved) return;
194
194
  c._scfl_isBeingObserved = YES;
195
- c.addObserver('flowSpacing', this, '_scfl_layoutPropertyDidChange');
196
- c.addObserver('isVisible', this, '_scfl_layoutPropertyDidChange');
197
- c.addObserver('useAbsoluteLayout', this, '_scfl_layoutPropertyDidChange');
198
- c.addObserver('calculatedWidth', this, '_scfl_layoutPropertyDidChange');
199
- c.addObserver('calculatedHeight', this, '_scfl_layoutPropertyDidChange');
200
- c.addObserver('startsNewRow', this, '_scfl_layoutPropertyDidChange');
201
- c.addObserver('isSpacer', this, '_scfl_layoutPropertyDidChange');
202
- c.addObserver('fillWidth', this, '_scfl_layoutPropertyDidChange');
203
- c.addObserver('fillHeight', this, '_scfl_layoutPropertyDidChange');
195
+ c.addObserver('flowSpacing', this, '_scfl_tileOnce');
196
+ c.addObserver('isVisible', this, '_scfl_tileOnce');
197
+ c.addObserver('useAbsoluteLayout', this, '_scfl_tileOnce');
198
+ c.addObserver('calculatedWidth', this, '_scfl_tileOnce');
199
+ c.addObserver('calculatedHeight', this, '_scfl_tileOnce');
200
+ c.addObserver('startsNewRow', this, '_scfl_tileOnce');
201
+ c.addObserver('isSpacer', this, '_scfl_tileOnce');
202
+ c.addObserver('maxSpacerLength', this, '_scfl_tileOnce');
203
+ c.addObserver('fillWidth', this, '_scfl_tileOnce');
204
+ c.addObserver('fillHeight', this, '_scfl_tileOnce');
204
205
  },
205
206
 
206
207
  /** @private
@@ -208,15 +209,16 @@ SC.FlowedLayout = {
208
209
  */
209
210
  unobserveChildLayout: function(c) {
210
211
  c._scfl_isBeingObserved = NO;
211
- c.removeObserver('flowSpacing', this, '_scfl_layoutPropertyDidChange');
212
- c.removeObserver('isVisible', this, '_scfl_layoutPropertyDidChange');
213
- c.removeObserver('useAbsoluteLayout', this, '_scfl_layoutPropertyDidChange');
214
- c.removeObserver('calculatedWidth', this, '_scfl_layoutPropertyDidChange');
215
- c.removeObserver('calculatedHeight', this, '_scfl_layoutPropertyDidChange');
216
- c.removeObserver('startsNewRow', this, '_scfl_layoutPropertyDidChange');
217
- c.removeObserver('isSpacer', this, '_scfl_layoutPropertyDidChange');
218
- c.removeObserver('fillWidth', this, '_scfl_layoutPropertyDidChange');
219
- c.removeObserver('fillHeight', this, '_scfl_layoutPropertyDidChange');
212
+ c.removeObserver('flowSpacing', this, '_scfl_tileOnce');
213
+ c.removeObserver('isVisible', this, '_scfl_tileOnce');
214
+ c.removeObserver('useAbsoluteLayout', this, '_scfl_tileOnce');
215
+ c.removeObserver('calculatedWidth', this, '_scfl_tileOnce');
216
+ c.removeObserver('calculatedHeight', this, '_scfl_tileOnce');
217
+ c.removeObserver('startsNewRow', this, '_scfl_tileOnce');
218
+ c.removeObserver('isSpacer', this, '_scfl_tileOnce');
219
+ c.removeObserver('maxSpacerLength', this, '_scfl_tileOnce');
220
+ c.removeObserver('fillWidth', this, '_scfl_tileOnce');
221
+ c.removeObserver('fillHeight', this, '_scfl_tileOnce');
220
222
  },
221
223
 
222
224
  /**
@@ -239,8 +241,8 @@ SC.FlowedLayout = {
239
241
  @type Hash
240
242
  */
241
243
  flowSpacingForChild: function(idx, view) {
242
- var spacing = view.get("flowSpacing");
243
- if (SC.none(spacing)) spacing = this.get("defaultFlowSpacing");
244
+ var spacing = view.get('flowSpacing');
245
+ if (SC.none(spacing)) spacing = this.get('defaultFlowSpacing');
244
246
  if (SC.none(spacing)) spacing = 0;
245
247
 
246
248
  if (SC.typeOf(spacing) === SC.T_NUMBER) {
@@ -266,9 +268,9 @@ SC.FlowedLayout = {
266
268
  @default {width: 0, height: 0}
267
269
  */
268
270
  flowSizeForChild: function(idx, view) {
269
- var cw = view.get('calculatedWidth'), ch = view.get('calculatedHeight');
270
-
271
- var calc = {}, f = view.get('frame'), l = view.get('layout');
271
+ var cw = view.get('calculatedWidth'), ch = view.get('calculatedHeight'),
272
+ layoutDirection = this.get('layoutDirection'),
273
+ calc = {}, f = view.get('frame'), l = view.get('layout');
272
274
  view._scfl_lastFrame = f;
273
275
 
274
276
  // if there is a calculated width, use that. NOTE: if calculatedWidth === 0,
@@ -276,20 +278,26 @@ SC.FlowedLayout = {
276
278
  if (cw) {
277
279
  calc.width = cw;
278
280
  } else {
279
- calc.width = f.width;
281
+ // we should use the layout width if available to avoid breaking layouts
282
+ // that have borders
283
+ calc.width = l.width || f.width;
280
284
  }
281
285
 
282
286
  // same for calculated height
283
287
  if (ch) {
284
288
  calc.height = ch;
285
289
  } else {
286
- calc.height = f.height;
290
+ // we should use the layout width if available to avoid breaking layouts
291
+ // that have borders
292
+ calc.height = l.height || f.height;
287
293
  }
288
-
294
+
289
295
  // if it is a spacer, we must set the dimension that it
290
296
  // expands in to 0.
291
297
  if (view.get('isSpacer')) {
292
- if (this.get('layoutDirection') === SC.LAYOUT_HORIZONTAL) {
298
+ calc.maxSpacerLength = view.get('maxSpacerLength');
299
+
300
+ if (layoutDirection === SC.LAYOUT_HORIZONTAL) {
293
301
  calc.width = l.minWidth || 0;
294
302
  } else {
295
303
  calc.height = l.minHeight || 0;
@@ -297,26 +305,12 @@ SC.FlowedLayout = {
297
305
  }
298
306
 
299
307
  // if it has a fillWidth/Height, clear it for later
300
- if (
301
- this.get('layoutDirection') === SC.LAYOUT_HORIZONTAL && view.get('fillHeight')
302
- ) {
308
+ if (layoutDirection === SC.LAYOUT_HORIZONTAL && view.get('fillHeight')) {
303
309
  calc.height = l.minHeight || 0;
304
- } else if (
305
- this.get('layoutDirection') === SC.LAYOUT_VERTICAL && view.get('fillWidth')
306
- ) {
310
+ } else if (layoutDirection === SC.LAYOUT_VERTICAL && view.get('fillWidth')) {
307
311
  calc.width = l.minWidth || 0;
308
312
  }
309
313
 
310
- // finally, RECREATE the view's layout if it is invalid (lacks a width or a height)
311
- if (l.width == undefined) {
312
- view.adjust('width', f.width);
313
- }
314
-
315
- if (l.height == undefined) {
316
- view.adjust('height', f.height);
317
- }
318
-
319
- // return
320
314
  return calc;
321
315
  },
322
316
 
@@ -439,7 +433,7 @@ SC.FlowedLayout = {
439
433
  lastIdx = idx;
440
434
 
441
435
  var row = {
442
- // always a referene to the plan
436
+ // always a reference to the plan
443
437
  plan: plan,
444
438
 
445
439
  // the combined size of the items in the row. This is used, for instance,
@@ -476,13 +470,13 @@ SC.FlowedLayout = {
476
470
  at the given index, and returning the index of the next item, if any.
477
471
  */
478
472
  _scfl_distributeChildrenIntoRow: function(children, startingAt, row) {
479
- var idx, len = children.length, plan = row.plan, child, childSize, spacing, childSpacedSize,
473
+ var idx, len = children.length, plan = row.plan, child, childSize, spacing,
480
474
  items = [], itemOffset = 0, isVertical = plan.isVertical, itemSize, itemLength,
475
+ maxSpacerLength,
481
476
  canWrap = this.get('canWrap'),
482
- newRowPending = NO;
483
-
484
- var maxItemLength = 0;
485
- var max = row.plan.maximumRowLength;
477
+ newRowPending = NO,
478
+ maxItemLength = 0,
479
+ max = row.plan.maximumRowLength;
486
480
 
487
481
  for (idx = startingAt; idx < len; idx++) {
488
482
  child = children[idx];
@@ -497,14 +491,13 @@ SC.FlowedLayout = {
497
491
  childSize = this.flowSizeForChild(idx, child);
498
492
  spacing = this.flowSpacingForChild(idx, child);
499
493
 
500
- childSpacedSize = {
501
- width: childSize.width + spacing.left + spacing.right,
502
- height: childSize.height + spacing.top + spacing.bottom
503
- };
504
-
505
- itemLength = childSpacedSize[isVertical ? 'height' : 'width'];
506
- itemSize = childSpacedSize[isVertical ? 'width' : 'height'];
507
-
494
+ childSize.width += spacing.left + spacing.right;
495
+ childSize.height += spacing.top + spacing.bottom;
496
+
497
+ itemLength = childSize[isVertical ? 'height' : 'width'];
498
+ if(!SC.none(childSize.maxSpacerLength)) maxSpacerLength = childSize.maxSpacerLength + (isVertical ? spacing.top + spacing.bottom : spacing.left + spacing.right);
499
+ itemSize = childSize[isVertical ? 'width' : 'height'];
500
+
508
501
  // there are two cases where we must start a new row: if the child or a
509
502
  // previous child in the row that wasn't included has
510
503
  // startsNewRow === YES, and if the item cannot fit. Neither applies if there
@@ -517,6 +510,7 @@ SC.FlowedLayout = {
517
510
  child: child,
518
511
 
519
512
  itemLength: itemLength,
513
+ maxSpacerLength: maxSpacerLength,
520
514
  itemSize: itemSize,
521
515
 
522
516
  spacing: spacing,
@@ -537,6 +531,7 @@ SC.FlowedLayout = {
537
531
  left: undefined, top: undefined,
538
532
  width: undefined, height: undefined
539
533
  };
534
+
540
535
 
541
536
  items.push(item);
542
537
  itemOffset += itemLength;
@@ -575,14 +570,17 @@ SC.FlowedLayout = {
575
570
  */
576
571
  _scfl_positionChildrenInRow: function(row) {
577
572
  var items = row.items, len = items.length, idx, item, position, rowSize = 0,
578
- spacerCount = 0, spacerSize, align = row.plan.align, shouldExpand = YES;
579
-
573
+ spacerCount = 0, spacerSize, align = row.plan.align, shouldExpand = YES,
574
+ leftOver = 0, noMaxWidth = NO;
575
+
580
576
  //
581
577
  // STEP ONE: DETERMINE SPACER SIZE + COUNT
582
578
  //
583
579
  for (idx = 0; idx < len; idx++) {
584
580
  item = items[idx];
585
- if (item.isSpacer) spacerCount += item.child.get('spaceUnits') || 1;
581
+ if (item.isSpacer) {
582
+ spacerCount += item.child.get('spaceUnits') || 1;
583
+ }
586
584
  }
587
585
 
588
586
  // justification is like adding a spacer between every item. We'll actually account for
@@ -591,6 +589,31 @@ SC.FlowedLayout = {
591
589
 
592
590
  // calculate spacer size
593
591
  spacerSize = Math.max(0, row.plan.maximumRowLength - row.rowLength) / spacerCount;
592
+
593
+ // determine individual spacer sizes using spacerSize and limited by
594
+ // each spacer's maxWidth (if they have one)
595
+ while(spacerSize > 0) {
596
+ for (idx = 0; idx < len; idx++) {
597
+ item = items[idx];
598
+
599
+ if (item.isSpacer) {
600
+ item.itemLength += spacerSize * (item.child.get('spaceUnits') || 1);
601
+ if(item.itemLength > item.maxSpacerLength) {
602
+ leftOver += item.itemLength - item.maxSpacerLength;
603
+ item.itemLength = item.maxSpacerLength;
604
+ }
605
+ else {
606
+ noMaxWidth = YES;
607
+ }
608
+ }
609
+ }
610
+
611
+ // if none of the spacers can expand further, stop
612
+ if(!noMaxWidth) break;
613
+
614
+ spacerSize = Math.round(leftOver / spacerCount);
615
+ leftOver = 0;
616
+ }
594
617
 
595
618
  //
596
619
  // STEP TWO: ADJUST FOR ALIGNMENT
@@ -610,17 +633,17 @@ SC.FlowedLayout = {
610
633
  //
611
634
  for (idx = 0; idx < len; idx++) {
612
635
  item = items[idx];
613
-
614
- if (item.isSpacer) {
615
- item.itemLength += spacerSize * (item.child.get('spaceUnits') || 1);
616
- }
617
-
636
+
637
+ // if this item has fillWidth or fillHeight set, the row should expand
638
+ // laterally
639
+ if(!item.fillRow) shouldExpand = NO;
640
+
618
641
  // if the item is not a fill-row item, this row has a size that all fill-row
619
642
  // items should expand to
620
- if (!item.fillRow) shouldExpand = NO;
621
643
  rowSize = Math.max(item.itemSize, rowSize);
622
644
 
623
645
  item.position = position;
646
+
624
647
  position += item.itemLength;
625
648
 
626
649
  // if justification is on, we have one more spacer
@@ -628,7 +651,7 @@ SC.FlowedLayout = {
628
651
  if (align === SC.ALIGN_JUSTIFY && idx < len - 1) position += spacerSize;
629
652
  }
630
653
 
631
- row.shouldExpand = shouldExpand;
654
+ row.shouldExpand = len > 0 ? shouldExpand : NO;
632
655
  row.rowLength = position - row.plan.rowStartPadding; // row length does not include padding
633
656
  row.rowSize = rowSize;
634
657
 
@@ -671,7 +694,7 @@ SC.FlowedLayout = {
671
694
  */
672
695
  _scfl_applyPlan: function(plan) {
673
696
  var rows = plan.rows, rowIdx, rowsLen, row, longestRow = 0, totalSize = 0,
674
- items, itemIdx, itemsLen, item, layout,
697
+ items, itemIdx, itemsLen, item, layout, itemSize,
675
698
 
676
699
  isVertical = plan.isVertical;
677
700
 
@@ -686,30 +709,20 @@ SC.FlowedLayout = {
686
709
  for (itemIdx = 0; itemIdx < itemsLen; itemIdx++) {
687
710
  item = items[itemIdx];
688
711
  item.child.beginPropertyChanges();
712
+
713
+ itemSize = item.fillRow ? row.rowSize : item.itemSize;
714
+
715
+ layout = {
716
+ left: item.spacing.left + (isVertical ? row.position : item.position),
717
+ top: item.spacing.top + (isVertical ? item.position : row.position),
718
+ width: isVertical ? itemSize : item.itemLength,
719
+ height: isVertical ? item.itemLength : itemSize
720
+ };
689
721
 
690
- layout = {};
691
-
692
- // we are _going_ to set position. that much is certain.
693
- layout.left = item.spacing.left + (isVertical ? row.position : item.position);
694
- layout.top = item.spacing.top + (isVertical ? item.position : row.position);
695
-
696
- // the size is more questionable: we only change that if the
697
- // item wants.
698
- if (item.fillRow) {
699
- layout[isVertical ? 'width' : 'height'] = row.rowSize;
700
- }
701
- if (item.isSpacer) {
702
- layout[isVertical ? 'height' : 'width'] = item.itemLength;
703
- }
704
-
705
- if (layout.width !== undefined) {
706
- layout.width -= item.spacing.left + item.spacing.right;
707
- }
708
- if (layout.height !== undefined) {
709
- layout.height -= item.spacing.top + item.spacing.bottom;
710
- }
722
+ layout.width -= item.spacing.left + item.spacing.right;
723
+ layout.height -= item.spacing.top + item.spacing.bottom;
711
724
 
712
- item.child.adjust(layout);
725
+ this.applyPlanToView(item.child, layout);
713
726
  item.child._scfl_lastLayout = layout;
714
727
 
715
728
  item.child.endPropertyChanges();
@@ -728,15 +741,33 @@ SC.FlowedLayout = {
728
741
 
729
742
  this.endPropertyChanges();
730
743
  },
744
+
745
+ /**
746
+ Applies the given layout to the view.
747
+ Override this if you would like your view to, for example, animate to a new position.
748
+ */
749
+ applyPlanToView: function(view, layout) {
750
+ view.adjust(layout);
751
+ },
731
752
 
732
753
  /** @private */
754
+ _scfl_tileOnce: function() {
755
+ this.invokeLast(this._scfl_tile);
756
+ },
757
+
733
758
  _scfl_tile: function() {
759
+ // short circuit when hidden
760
+ if(!this.get('isVisibleInWindow')) return;
761
+
734
762
  // first, do the plan
735
763
  var plan = this._scfl_createPlan();
736
764
  this._scfl_distributeChildrenIntoRows(plan);
737
765
  this._scfl_positionChildrenInRows(plan);
738
766
  this._scfl_positionRows(plan);
739
767
  this._scfl_applyPlan(plan);
768
+
769
+ // save so it can be observed
770
+ this.setIfChanged('numberOfRows', plan.rows.length);
740
771
 
741
772
  // second, observe all children, and stop observing any children we no longer
742
773
  // should be observing.
@@ -764,8 +795,6 @@ SC.FlowedLayout = {
764
795
 
765
796
  /** @private */
766
797
  _scfl_frameDidChange: function() {
767
- if (this._scfl_isChangingSize) return;
768
-
769
798
  var frame = this.get("frame"), lf = this._scfl_lastFrameSize || {};
770
799
  this._scfl_lastFrameSize = SC.clone(frame);
771
800
 
@@ -773,8 +802,8 @@ SC.FlowedLayout = {
773
802
  return;
774
803
  }
775
804
 
776
- this.invokeOnce("_scfl_tile");
777
- }.observes("frame"),
805
+ this._scfl_tileOnce();
806
+ }.observes('frame'),
778
807
 
779
808
  /** @private */
780
809
  destroyMixin: function() {
@@ -788,7 +817,7 @@ SC.FlowedLayout = {
788
817
  },
789
818
 
790
819
  /** @private
791
- Reorders childViews so that the passed views are at the beginning in the order they are passed. Needed because childViews are layed out in the order they appear in childViews.
820
+ Reorders childViews so that the passed views are at the beginning in the order they are passed. Needed because childViews are laid out in the order they appear in childViews.
792
821
  */
793
822
  reorder: function(views) {
794
823
  if(!SC.typeOf(views) === SC.T_ARRAY) views = arguments;
@@ -800,6 +829,8 @@ SC.FlowedLayout = {
800
829
 
801
830
  while(i-- > 0) {
802
831
  view = views[i];
832
+
833
+ if(SC.typeOf(view) === SC.T_STRING) view = this.get(view);
803
834
 
804
835
  childViews.removeObject(view);
805
836
  childViews.unshiftObject(view);
@@ -812,3 +843,4 @@ SC.FlowedLayout = {
812
843
  return this;
813
844
  }
814
845
  };
846
+