sproutcore 1.7.1.beta → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -7,7 +7,7 @@
7
7
  @type String
8
8
  @constant
9
9
  */
10
- SC.FOCUS_ALL_CONTROLS = YES;
10
+ SC.FOCUS_ALL_CONTROLS = NO;
11
11
 
12
12
  /*
13
13
  TODO [CC @ 1.5] Remove this deprecation warning eventually
@@ -58,6 +58,16 @@ SC.AutoResize = {
58
58
  */
59
59
  shouldMeasureSize: YES,
60
60
 
61
+ /**
62
+ Caches sizes for measured strings. This cache does not have a max size, so
63
+ should only be used when a view has a limited number of possible values.
64
+ Multiple views that have the same batchResizeId will share the same cache.
65
+
66
+ @type Boolean
67
+ @default NO
68
+ */
69
+ shouldCacheSizes: NO,
70
+
61
71
  /**
62
72
  Determines if the view's width should be resized
63
73
  on calculation.
@@ -86,6 +96,101 @@ SC.AutoResize = {
86
96
  @type Rect
87
97
  */
88
98
  measuredSize: { width: 0, height: 0 },
99
+
100
+ /**
101
+ If provided, will limit the maximum width to this value.
102
+ */
103
+ maxWidth: null,
104
+
105
+ /**
106
+ If provided, will limit the maximum height to this value.
107
+ */
108
+ maxHeight: null,
109
+
110
+ /**
111
+ If YES, the view's text will be resized to fit the view. This is applied _after_ any
112
+ resizing, so will only take affect if shouldAutoResize is off, or a maximum width/height
113
+ is set.
114
+
115
+ You also must set a minimum and maximum font size. Any auto resizing will happen at the
116
+ maximum size, and then the text will be resized as necessary.
117
+ */
118
+ shouldAutoFitText: NO,
119
+
120
+ /**
121
+ If NO, the calculated font size may be any size between minFontSize and
122
+ maxFontSize. If YES, it will only be either minFontSize or maxFontSize.
123
+
124
+ @type Boolean
125
+ @default NO
126
+ */
127
+ autoFitDiscreteFontSizes: NO,
128
+
129
+ /**
130
+ The minimum font size to use when automatically fitting text. If shouldAutoFitText is set,
131
+ this _must_ be supplied.
132
+
133
+ Font size is in pixels.
134
+ */
135
+ minFontSize: 12,
136
+
137
+ /**
138
+ The maximum font size to use when automatically fitting text. If shouldAutoFitText is set,
139
+ this _must_ be supplied.
140
+
141
+ Font size is in pixels.
142
+ */
143
+ maxFontSize: 20,
144
+
145
+ /**
146
+ If shouldAutoFitText is YES, this is the calculated font size.
147
+ */
148
+ calculatedFontSize: 20,
149
+
150
+ fontPropertyDidChange: function() {
151
+ if(this.get('shouldAutoFitText')) this.invokeLast(this.fitTextToFrame);
152
+ }.observes('shouldAutoFitText', 'minFontSize', 'maxFontSize', 'measuredSize'),
153
+
154
+ /**
155
+ Observes the measured size and actually performs the resize if necessary.
156
+ */
157
+ measuredSizeDidChange: function() {
158
+ var measuredSize = this.get('measuredSize'),
159
+ calculatedWidth = measuredSize.width, calculatedHeight = measuredSize.height,
160
+ paddingHeight, paddingWidth,
161
+ autoResizePadding = this.get('autoResizePadding') || 0,
162
+ maxWidth = this.get('maxWidth'), maxHeight = this.get('maxHeight');
163
+
164
+ if(SC.typeOf(autoResizePadding) === SC.T_NUMBER) {
165
+ paddingHeight = paddingWidth = autoResizePadding;
166
+ } else {
167
+ paddingHeight = autoResizePadding.height;
168
+ paddingWidth = autoResizePadding.width;
169
+ }
170
+
171
+ calculatedHeight += paddingHeight;
172
+ calculatedWidth += paddingWidth;
173
+
174
+ if(this.get('shouldAutoResize')) {
175
+ // if we are allowed to autoresize, adjust the layout
176
+ if (this.get('shouldResizeWidth')) {
177
+ if (maxWidth && calculatedWidth > maxWidth) {
178
+ calculatedWidth = maxWidth;
179
+ }
180
+ this.set('calculatedWidth', calculatedWidth);
181
+ this.adjust('width', calculatedWidth);
182
+ }
183
+
184
+ if (this.get('shouldResizeHeight')) {
185
+ if (maxHeight && calculatedHeight > maxHeight) {
186
+ calculatedHeight = maxHeight;
187
+ }
188
+ this.set('calculatedHeight', calculatedHeight);
189
+ this.adjust('height', calculatedHeight);
190
+ }
191
+ }
192
+
193
+ }.observes('shouldAutoResize', 'measuredSize', 'autoResizePadding', 'maxWidth', 'minWidth', 'shouldResizeWidth', 'shouldResizeHeight'),
89
194
 
90
195
  /**
91
196
  @private
@@ -99,16 +204,6 @@ SC.AutoResize = {
99
204
  // @endif
100
205
  },
101
206
 
102
- /**
103
- Observe the autoResizePadding so we can update our measurements if it changes.
104
-
105
- @private
106
- */
107
- _scar_autoResizePaddingDidChange: function() {
108
- this.invokeOnce('measureSize');
109
- }.observes('autoResizePadding'),
110
-
111
-
112
207
  /**
113
208
  If this property is provided, all views that share the same value for this property will be resized as a batch for increased performance.
114
209
 
@@ -116,45 +211,35 @@ SC.AutoResize = {
116
211
  */
117
212
  batchResizeId: null,
118
213
 
119
- /** @private */
120
- _scar_measurementPending: NO,
121
-
122
- /** @private */
123
- _scar_requestedBatchResizeId: null,
124
-
125
- /** @private
126
- If the batch id changed while a request is out, we have to fix it
127
- */
128
- _scar_batchResizeIdDidChange: function() {
129
- var batchResizeId = this.get('batchResizeId'),
130
- requestedBatchResizeId = this._scar_requestedBatchResizeId;
131
-
132
- // check if a request is out and the id changed
133
- if(this._scar_measurementPending && this._scar_requestedBatchResizeId !== batchResizeId) {
134
- // if so, cancel the old request and make a new one
135
- SC.AutoResizeManager.cancelMeasurementForView(this, requestedBatchResizeId);
136
- SC.AutoResizeManager.scheduleMeasurementForView(this, batchResizeId);
137
-
138
- // update the requested batchResizeId to the new id
139
- this._scar_requestedBatchResizeId = batchResizeId;
140
- }
141
- }.observes('batchResizeId'),
142
-
143
214
  /**
144
- Schedules a measurement to happen later, in batch mode. Only valid when the view
145
- has a `batchResizeId`.
215
+ Schedules a measurement to happen later.
146
216
  */
147
217
  scheduleMeasurement: function() {
148
- if (!this.get('shouldMeasureSize')) {
149
- return;
150
- }
151
-
152
218
  var batchResizeId = this.get('batchResizeId');
219
+
220
+ // only measure if we are visible, active, and the text or style actually changed
221
+ if (!this.get('shouldMeasureSize') || !this.get('isVisibleInWindow') || (this.get('autoResizeText') === this._lastMeasuredText && batchResizeId === this._lastMeasuredId)) return;
222
+
223
+ // batchResizeId is allowed to be undefined; views without an id will just
224
+ // get measured one at a time
153
225
  SC.AutoResizeManager.scheduleMeasurementForView(this, batchResizeId);
226
+ }.observes('isVisibleInWindow', 'shouldMeasureSize', 'autoResizeText', 'batchResizeId'),
227
+
228
+ _lastMeasuredText: null,
229
+
230
+ _cachedMetrics: function(key, value) {
231
+ if(!this.get('shouldCacheSizes')) return;
232
+
233
+ // if we don't have a tag, then it is unique per view
234
+ // you shouldn't usually turn on caching without a tag, but it is supported
235
+ var cacheSlot = SC.cacheSlotFor(this.get('batchResizeId') || this),
236
+ autoResizeText = this.get('autoResizeText');
154
237
 
155
- this._scar_measurementPending = YES;
156
- this._scar_requestedBatchResizeId = batchResizeId;
157
- }.observes('isVisible'),
238
+ if(value) cacheSlot[autoResizeText] = value;
239
+ else value = cacheSlot[autoResizeText];
240
+
241
+ return value;
242
+ }.property('shouldCacheSizes', 'autoResizeText', 'batchResizeId').cacheable(),
158
243
 
159
244
  /**
160
245
  Measures the size of the view.
@@ -162,70 +247,202 @@ SC.AutoResize = {
162
247
  @param batch For internal use during batch resizing.
163
248
  */
164
249
  measureSize: function(batch) {
165
- var metrics, layer, value = this.get('autoResizeText'),
166
- autoSizePadding, paddingHeight, paddingWidth,
167
- ignoreEscape = !this.get('escapeHTML');
250
+ var metrics, layer = this.get('autoResizeLayer'), autoResizeText = this.get('autoResizeText'),
251
+ ignoreEscape = !this.get('escapeHTML'),
252
+ batchResizeId = this.get('batchResizeId'),
253
+ cachedMetrics = this.get('_cachedMetrics'),
254
+ maxFontSize = this.get('maxFontSize');
255
+
256
+ if(!layer) return;
168
257
 
169
- // There are two special cases.
258
+ // There are three special cases.
259
+ // - size is cached: the cached size is used with no measurement
260
+ // necessary
170
261
  // - empty: we should do nothing. The metrics are 0.
171
262
  // - batch mode: just call measureString.
172
263
  //
173
264
  // If we are in neither of those special cases, we should go ahead and
174
265
  // resize normally.
175
266
  //
176
- if (SC.none(value) || value === "") {
177
- metrics = { width: 0, height: 0 };
178
- } else if (batch) {
179
- metrics = SC.measureString(value, ignoreEscape);
180
- } else {
181
- // Normal resize pattern: get our own layer, pass it as a template to SC.metricsForString.
182
- layer = this.get('autoResizeLayer');
183
-
184
- if(!layer) {
185
- return;
186
- }
267
+ if(cachedMetrics) {
268
+ metrics = cachedMetrics;
269
+ }
187
270
 
188
- metrics = SC.metricsForString(value, layer, this.get('classNames'), ignoreEscape);
271
+ else if (SC.none(autoResizeText) || autoResizeText === "") {
272
+ metrics = { width: 0, height: 0 };
189
273
  }
190
274
 
191
- // metrics should include padding
192
- autoSizePadding = this.get('autoResizePadding') || 0;
193
- if(SC.typeOf(autoSizePadding) === SC.T_NUMBER) {
194
- paddingHeight = paddingWidth = autoSizePadding;
195
- } else {
196
- paddingHeight = autoSizePadding.height;
197
- paddingWidth = autoSizePadding.width;
275
+ else if (batch) {
276
+ metrics = SC.measureString(autoResizeText, ignoreEscape);
198
277
  }
199
278
 
200
- metrics.width += paddingWidth;
201
- metrics.height += paddingHeight;
279
+ else {
280
+ this.prepareLayerForStringMeasurement(layer);
281
+
282
+ metrics = SC.metricsForString(autoResizeText, layer, this.get('classNames'), ignoreEscape);
283
+ }
202
284
 
203
285
  // In any case, we set measuredSize.
204
286
  this.set('measuredSize', metrics);
205
287
 
206
- if (this.get('shouldAutoResize')) {
207
- // if we are allowed to autoresize, adjust the layout
208
- if (this.get('shouldResizeWidth')) {
209
- this.adjust('width', metrics.width);
210
- }
288
+ // and update the cache if we are using it
289
+ if(this.get('shouldCacheSizes')) this.setIfChanged('_cachedMetrics', metrics);
211
290
 
212
- if (this.get('shouldResizeHeight')) {
213
- this.adjust('height', metrics.height);
214
- }
291
+ // set the measured value so we can avoid extra measurements in the future
292
+ this._lastMeasuredText = autoResizeText;
293
+ this._lastMeasuredId = batchResizeId;
294
+
295
+ return metrics;
296
+ },
297
+
298
+
299
+ //
300
+ // FITTING TEXT
301
+ //
302
+
303
+ /**
304
+ If we are fitting text, the layer must be measured with its font size set to our
305
+ maximum font size.
306
+ */
307
+ prepareLayerForStringMeasurement: function(layer) {
308
+ var maxFontSize = this.get('maxFontSize');
215
309
 
310
+ if (this.get('shouldAutoFitText') && this.get('calculatedFontSize') !== maxFontSize) {
311
+ layer.style.fontSize = maxFontSize + "px";
216
312
  }
313
+ },
314
+
315
+ /**
316
+ Whenever the view resizes, the text fitting must be reevaluated.
317
+ */
318
+ viewDidResize: function(orig) {
319
+ orig();
320
+
321
+ this.fontPropertyDidChange();
322
+ }.enhance(),
323
+
324
+ /**
325
+ Fits the text into the frame's size, minus autoResizePadding.
326
+ */
327
+ fitTextToFrame: function() {
328
+ // we can only fit text when we have a layer.
329
+ var layer = this.get('autoResizeLayer');
330
+ if (!layer) return;
217
331
 
218
- this._scar_measurementPending = NO;
332
+ var maxFontSize = this.get('maxFontSize'),
333
+ minFontSize = this.get('minFontSize');
219
334
 
220
- return metrics;
221
- },
335
+ // if the font size has been adjusted, reset it to the max
336
+ this.prepareLayerForStringMeasurement(layer);
337
+
338
+ var frame = this.get('frame'),
339
+
340
+ padding = this.get('autoResizePadding') || 0,
341
+
342
+ // these need to be shrunk by 1 pixel or text that is exactly as wide as
343
+ // the frame will be truncated
344
+ width = frame.width - 1, height = frame.height - 1,
345
+ measured = this.get('measuredSize'),
346
+ mWidth = measured.width, mHeight = measured.height;
347
+
348
+ // figure out and apply padding to the width/height
349
+ if(SC.typeOf(padding) === SC.T_NUMBER) {
350
+ width -= padding;
351
+ height -= padding;
352
+ } else {
353
+ width -= padding.width;
354
+ height -= padding.height;
355
+ }
356
+
357
+ // measured size is at maximum. If there is no resizing to be done, short-circuit.
358
+ if (mWidth <= width && mHeight <= height) return;
359
+
360
+ // if only discrete values are allowed, we can short circuit here and just
361
+ // use the minimum
362
+ if(this.get('autoFitDiscreteFontSizes')) {
363
+ actual = minFontSize;
364
+ }
222
365
 
366
+ // otherwise we have to find the actual best font size
367
+ else {
368
+ // now, we are going to make an estimate font size. We will figure out the proportion
369
+ // of both actual width and actual height to the measured width and height, and then we'll
370
+ // pick the smaller. We'll multiply that by the maximum font size to figure out
371
+ // a rough guestimate of the proper font size.
372
+ var xProportion = width / mWidth, yProportion = height / mHeight,
373
+
374
+ guestimate = Math.floor(maxFontSize * Math.min(xProportion, yProportion)),
375
+ actual,
376
+
377
+ classNames = this.get('classNames'),
378
+ ignoreEscape = !this.get('escapeHTML'),
379
+ value = this.get('autoResizeText'),
380
+
381
+ metrics;
382
+
383
+
384
+ guestimate = actual = Math.min(maxFontSize, Math.max(minFontSize, guestimate));
385
+
386
+ // Now, we must test the guestimate. Based on that, we'll either loop down
387
+ // or loop up, depending on the measured size.
388
+ layer.style.fontSize = guestimate + "px";
389
+ metrics = SC.metricsForString(value, layer, classNames, ignoreEscape);
390
+
391
+ if (metrics.width > width || metrics.height > height) {
392
+
393
+ // if we're larger, we must go down until we are smaller, at which point we are done.
394
+ for (guestimate = guestimate - 1; guestimate >= minFontSize; guestimate--) {
395
+ layer.style.fontSize = guestimate + "px";
396
+ metrics = SC.metricsForString(value, layer, classNames, ignoreEscape);
397
+
398
+ // always have an actual in this case; even if we can't get it small enough, we want
399
+ // to keep this as close as possible.
400
+ actual = guestimate;
401
+
402
+ // if the new size is small enough, stop shrinking and set it for real
403
+ if (metrics.width <= width && metrics.height <= height) {
404
+ break;
405
+ }
406
+ }
407
+
408
+ } else if (metrics.width < width || metrics.height < height) {
409
+ // if we're smaller, we must go up until we hit maxFontSize or get larger. If we get
410
+ // larger, we want to use the previous guestimate (which we know was valid)
411
+ //
412
+ // So, we'll start actual at guestimate, and only increase it while we're smaller.
413
+ for (guestimate = guestimate + 1; guestimate <= maxFontSize; guestimate++) {
414
+ layer.style.fontSize = guestimate + "px";
415
+ metrics = SC.metricsForString(value, layer, classNames, ignoreEscape);
416
+
417
+ // we update actual only if it is still valid. Then below, whether valid
418
+ // or not, if we are at or past the width/height we leave
419
+ if (metrics.width <= width && metrics.height <= height) {
420
+ actual = guestimate;
421
+ }
422
+
423
+ // we put this in a separate if statement JUST IN CASE it is ===.
424
+ // Unlikely, but possible, and why ruin a good thing?
425
+ if (metrics.width >= width || metrics.height >= height){
426
+ break;
427
+ }
428
+ }
429
+ }
430
+ }
431
+
432
+ layer.style.fontSize = actual + "px";
433
+ this.set('calculatedFontSize', actual);
434
+ },
435
+
223
436
  /**
224
- @private
437
+ Extends renderSettingsToContext to add font size if shouldAutoFitText is YES.
225
438
  */
226
- _scar_valueDidChange: function() {
227
- this.scheduleMeasurement();
228
- }.observes('autoResizeText'),
439
+ applyAttributesToContext: function(orig, context) {
440
+ orig(context);
441
+
442
+ if (this.get('shouldAutoFitText')) {
443
+ context.css('font-size', this.get('calculatedFontSize') + "px");
444
+ }
445
+ }.enhance(),
229
446
 
230
447
  /**
231
448
  @private
@@ -247,19 +464,12 @@ SC.AutoResize = {
247
464
  * methods/properties into each view.
248
465
  */
249
466
  SC.AutoResizeManager = {
250
-
251
- /**
252
- A hash of views needing resizing, mapped from batch resize ID to SC.CoreSets
253
- of views.
254
- */
255
- viewsNeedingResize: null,
256
-
257
467
  /**
258
468
  Views queued for batch resizing, but with no batch resize id.
259
469
 
260
470
  @property {SC.CoreSet}
261
471
  */
262
- untaggedViews: null,
472
+ measurementQueue: SC.CoreSet.create(),
263
473
 
264
474
  /**
265
475
  Schedules a re-measurement for the specified view in the batch with the
@@ -271,20 +481,8 @@ SC.AutoResizeManager = {
271
481
  @param view The view to measure.
272
482
  @param id The id of the batch to measure the view in.
273
483
  */
274
- scheduleMeasurementForView: function(view, id) {
275
- // views with no tag just get put in their own list
276
- if(SC.none(id)) {
277
- var untaggedViews = this.untaggedViews || (this.untaggedViews = SC.CoreSet.create());
278
-
279
- untaggedViews.add(view);
280
-
281
- // views with a batch resize id set for each tag
282
- } else {
283
- var needResize = this.viewsNeedingResize || (this.viewsNeedingResize = {}),
284
- views = needResize[id] || (needResize[id] = SC.CoreSet.create());
285
-
286
- views.add(view);
287
- }
484
+ scheduleMeasurementForView: function(view) {
485
+ this.measurementQueue.add(view);
288
486
 
289
487
  SC.RunLoop.currentRunLoop.invokeLast(this.doBatchResize);
290
488
  },
@@ -296,11 +494,7 @@ SC.AutoResizeManager = {
296
494
  @param id The batch id the view was scheduled in.
297
495
  */
298
496
  cancelMeasurementForView: function(view, id) {
299
- var set = SC.none(id) ? this.untaggedViews : this.viewsNeedingResize[id];
300
-
301
- if(set) {
302
- set.remove(view);
303
- }
497
+ this.measurementQueue.remove(view);
304
498
  },
305
499
 
306
500
  /**
@@ -314,39 +508,52 @@ SC.AutoResizeManager = {
314
508
  return SC.AutoResizeManager.doBatchResize();
315
509
  }
316
510
 
317
- var tag, views, view, layer, batches, prepared;
318
-
319
- // first measure all the batched views
320
- batches = this.viewsNeedingResize;
321
- for(tag in batches) {
322
- if (batches.hasOwnProperty(tag)) {
323
- views = batches[tag];
324
-
325
- // now measure the rest using the same settings
326
- while ((view = views.pop())) {
327
- if(view.get('isVisible') && (layer = view.get('autoResizeLayer'))) {
328
- if(!prepared) SC.prepareStringMeasurement(layer);
329
-
330
- view.measureSize(YES);
511
+ var tag, view, layer, measurementQueue = this.measurementQueue, prepared, autoResizeText,
512
+ i, len;
513
+
514
+ while((len = measurementQueue.get('length')) > 0) {
515
+ prepared = NO;
516
+ // save the first tag we see
517
+ tag = measurementQueue[len - 1].get('batchResizeId');
518
+
519
+ // now we iterate over all the views with the same tag
520
+ for(i = len - 1; i >= 0; --i) {
521
+ view = measurementQueue[i];
522
+
523
+ // if the view has a different tag, skip it
524
+ if(view.get('batchResizeId') !== tag) continue;
525
+
526
+ // make sure the view is still qualified to be measured
527
+ if(view.get('isVisibleInWindow') && view.get('shouldMeasureSize') && (layer = view.get('autoResizeLayer'))) {
528
+ autoResizeText = view.get('autoResizeText');
529
+
530
+ // if the text is empty or a size is cached don't bother preparing
531
+ if(!SC.none(autoResizeText) && autoResizeText !== "" && !view.get('_cachedMetrics') && !prepared) {
532
+ // this is a bit of a hack: before we can prepare string measurement, there are cases where we
533
+ // need to reset the font size first (specifically, if we are also fitting text)
534
+ //
535
+ // It is expected that all views in a batch will have the same font settings.
536
+ view.prepareLayerForStringMeasurement(layer);
537
+
538
+ // now we can tell SC to prepare the layer with the settings from the view's layer
539
+ SC.prepareStringMeasurement(layer, view.get('classNames'));
540
+ prepared = YES;
331
541
  }
332
- }
333
542
 
334
- // if they were all isVisible:NO, then prepare was never called
335
- // so dont call teardown
336
- if(prepared) SC.teardownStringMeasurement();
337
- }
338
- }
543
+ view.measureSize(YES);
544
+ }
339
545
 
340
- // measure views with no batch id
341
- views = this.untaggedViews;
546
+ // it's been handled
547
+ measurementQueue.remove(view);
342
548
 
343
- if(!views) {
344
- return;
345
- }
549
+ // if the view didn't have a tag, we can't batch so just move on
550
+ if(!tag) break;
551
+ }
346
552
 
347
- while((view = views.pop())) {
348
- view.measureSize();
553
+ // only call teardown if prepare was called
554
+ if(prepared) {
555
+ SC.teardownStringMeasurement();
556
+ }
349
557
  }
350
558
  }
351
-
352
559
  };