sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355
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.
- data/Buildfile +4 -2
- data/frameworks/sproutcore/Buildfile +3 -2
- data/frameworks/sproutcore/README +2 -1
- data/frameworks/sproutcore/apps/docs/core.js +27 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
- data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
- data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
- data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
- data/frameworks/sproutcore/apps/docs/main.js +30 -0
- data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
- data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
- data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
- data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
- data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
- data/frameworks/sproutcore/apps/tests/core.js +114 -16
- data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
- data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
- data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
- data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
- data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
- data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
- data/frameworks/sproutcore/apps/tests/main.js +9 -20
- data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
- data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
- data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
- data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
- data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
- data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
- data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
- data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
- data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
- data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
- data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
- data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
- data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
- data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
- data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
- data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
- data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
- data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
- data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
- data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
- data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
- data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
- data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
- data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
- data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
- data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
- data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
- data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
- data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
- data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
- data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
- data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
- data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
- data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
- data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
- data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
- data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
- data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
- data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
- data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
- data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
- data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
- data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
- data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
- data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
- data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
- data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
- data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
- data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
- data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
- data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
- data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
- data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
- data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
- data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
- data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
- data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
- data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
- data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
- data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
- data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
- data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
- data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
- data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
- data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
- data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
- data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
- data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
- data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
- data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
- data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
- data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
- data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
- data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
- data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
- data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
- data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
- data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
- data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
- data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
- data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
- data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
- data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
- data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
- data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
- data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
- data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
- data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
- data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
- data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
- data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
- data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
- data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
- data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
- data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
- data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
- data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
- data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
- data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
- data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
- data/frameworks/sproutcore/frameworks/runtime/README +1 -0
- data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
- data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
- data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
- data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
- data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
- data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
- data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
- data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
- data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
- data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
- data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
- data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
- data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
- data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
- data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
- data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
- data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
- data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
- data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
- data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
- data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
- data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
- data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
- data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
- data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
- data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
- data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
- data/frameworks/sproutcore/lib/index.rhtml +4 -1
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
- data/lib/sproutcore/builders/minify.rb +2 -2
- data/lib/sproutcore/builders/test.rb +1 -1
- data/lib/sproutcore/buildfile.rb +1 -0
- data/lib/sproutcore/rack/dev.rb +1 -1
- data/lib/sproutcore/rack/filesystem.rb +265 -0
- data/lib/sproutcore/rack/proxy.rb +11 -3
- data/lib/sproutcore/rack/service.rb +11 -1
- data/lib/sproutcore/tools.rb +11 -1
- data/lib/sproutcore/tools/server.rb +6 -4
- data/vendor/jsdoc/README.txt +151 -0
- data/vendor/jsdoc/changes.txt +47 -0
- metadata +263 -308
- data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
- data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
- data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
- data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
- data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
- data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
- data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
- data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
- data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
- data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
- data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
- data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
- data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
- data/spec/buildtasks/manifest/spec_helper.rb +0 -35
- data/spec/buildtasks/target_spec.rb +0 -214
- data/spec/fixtures/builder_tests/Buildfile +0 -15
- data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
- data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
- data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
- data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
- data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
- data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
- data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
- data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
- data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
- data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
- data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
- data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
- data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
- data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
- data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
- data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/Buildfile +0 -1
- data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/Buildfile +0 -8
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/nested/Buildfile +0 -8
- data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
- data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
- data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
- data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
- data/spec/fixtures/real_world/Buildfile +0 -12
- data/spec/fixtures/real_world/apps/account/README +0 -1
- data/spec/fixtures/real_world/apps/calendar/README +0 -1
- data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
- data/spec/fixtures/real_world/apps/files/README +0 -1
- data/spec/fixtures/real_world/apps/mail/README +0 -1
- data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
- data/spec/fixtures/real_world/apps/photos/README +0 -1
- data/spec/fixtures/real_world/apps/uploader/README +0 -1
- data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
- data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
- data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
- data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
- data/spec/fixtures/recursive_project/Buildfile +0 -8
- data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
- data/spec/lib/builders/combine_spec.rb +0 -67
- data/spec/lib/builders/html_spec.rb +0 -577
- data/spec/lib/builders/javascript_spec.rb +0 -81
- data/spec/lib/builders/sass_spec.rb +0 -43
- data/spec/lib/builders/spec_helper.rb +0 -30
- data/spec/lib/builders/strings_spec.rb +0 -52
- data/spec/lib/builders/stylesheet_spec.rb +0 -63
- data/spec/lib/builders/test_index_spec.rb +0 -44
- data/spec/lib/builders/test_spec.rb +0 -135
- data/spec/lib/buildfile/config_for_spec.rb +0 -81
- data/spec/lib/buildfile/define_spec.rb +0 -59
- data/spec/lib/buildfile/dup_spec.rb +0 -65
- data/spec/lib/buildfile/invoke_spec.rb +0 -130
- data/spec/lib/buildfile/load_spec.rb +0 -49
- data/spec/lib/buildfile/task/dup_spec.rb +0 -55
- data/spec/lib/buildfile/task_defined_spec.rb +0 -17
- data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
- data/spec/lib/buildfile_commands/config_spec.rb +0 -97
- data/spec/lib/buildfile_commands/import_spec.rb +0 -17
- data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
- data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
- data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
- data/spec/lib/buildfile_commands/task_spec.rb +0 -36
- data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
- data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
- data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
- data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
- data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
- data/spec/lib/models/hash_struct/method_missing.rb +0 -41
- data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
- data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
- data/spec/lib/models/manifest/build_spec.rb +0 -78
- data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
- data/spec/lib/models/manifest/find_entry.rb +0 -84
- data/spec/lib/models/manifest/prepare_spec.rb +0 -62
- data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
- data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
- data/spec/lib/models/project/add_target_spec.rb +0 -44
- data/spec/lib/models/project/buildfile_spec.rb +0 -35
- data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
- data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
- data/spec/lib/models/project/target_for_spec.rb +0 -33
- data/spec/lib/models/project/targets_spec.rb +0 -62
- data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
- data/spec/lib/models/target/config_spec.rb +0 -30
- data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
- data/spec/lib/models/target/installed_languages_spec.rb +0 -47
- data/spec/lib/models/target/lproj_for_spec.rb +0 -38
- data/spec/lib/models/target/manifest_for_spec.rb +0 -42
- data/spec/lib/models/target/parent_target_spec.rb +0 -21
- data/spec/lib/models/target/prepare_spec.rb +0 -53
- data/spec/lib/models/target/required_targets_spec.rb +0 -119
- data/spec/lib/models/target/target_for_spec.rb +0 -56
- data/spec/lib/tools/build_number_spec.rb +0 -28
- data/spec/lib/tools/gen_spec.rb +0 -207
- data/spec/lib/tools/tools_spec.rb +0 -78
- data/spec/spec_helper.rb +0 -138
- data/vendor/github_gem_lint.rb +0 -22
- data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
@@ -31,14 +31,14 @@ SC._ChainObserver = function(property) {
|
|
31
31
|
} ;
|
32
32
|
|
33
33
|
// This is the primary entry point. Configures the chain.
|
34
|
-
SC._ChainObserver.createChain = function(rootObject, path, target, method) {
|
34
|
+
SC._ChainObserver.createChain = function(rootObject, path, target, method, context) {
|
35
35
|
|
36
|
-
var parts = path.split('.') ;
|
37
|
-
|
38
36
|
// First we create the chain.
|
39
|
-
var
|
40
|
-
|
41
|
-
|
37
|
+
var parts = path.split('.'),
|
38
|
+
root = new SC._ChainObserver(parts[0]),
|
39
|
+
tail = root,
|
40
|
+
len = parts.length;
|
41
|
+
|
42
42
|
for(var idx=1;idx<len;idx++) {
|
43
43
|
tail = tail.next = new SC._ChainObserver(parts[idx]) ;
|
44
44
|
}
|
@@ -50,7 +50,7 @@ SC._ChainObserver.createChain = function(rootObject, path, target, method) {
|
|
50
50
|
|
51
51
|
// Finally, set the target/method on the tail so that future changes will
|
52
52
|
// trigger.
|
53
|
-
tail.target = target; tail.method = method ;
|
53
|
+
tail.target = target; tail.method = method ; tail.context = context ;
|
54
54
|
|
55
55
|
// and return the root to save
|
56
56
|
return root ;
|
@@ -108,10 +108,16 @@ SC._ChainObserver.prototype = {
|
|
108
108
|
if (this.next) this.next.objectDidChange(value) ;
|
109
109
|
|
110
110
|
// if we have a target/method, call it.
|
111
|
-
var target
|
111
|
+
var target = this.target,
|
112
|
+
method = this.method,
|
113
|
+
context = this.context ;
|
112
114
|
if (target && method) {
|
113
|
-
var rev = object.propertyRevision ;
|
114
|
-
|
115
|
+
var rev = object ? object.propertyRevision : null ;
|
116
|
+
if (context) {
|
117
|
+
method.call(target, object, property, value, context, rev);
|
118
|
+
} else {
|
119
|
+
method.call(target, object, property, value, rev) ;
|
120
|
+
}
|
115
121
|
}
|
116
122
|
},
|
117
123
|
|
@@ -128,7 +134,7 @@ SC._ChainObserver.prototype = {
|
|
128
134
|
if (this.next) this.next.destroyChain() ;
|
129
135
|
|
130
136
|
// and clear left overs...
|
131
|
-
this.next = this.target = this.method = this.object = null
|
137
|
+
this.next = this.target = this.method = this.object = this.context = null;
|
132
138
|
return null ;
|
133
139
|
}
|
134
140
|
|
@@ -63,24 +63,61 @@ SC.Observers = {
|
|
63
63
|
}
|
64
64
|
},
|
65
65
|
|
66
|
+
// Range Observers register here to indicate that they may potentially
|
67
|
+
// need to start observing.
|
68
|
+
addPendingRangeObserver: function(observer) {
|
69
|
+
var ro = this.rangeObservers;
|
70
|
+
if (!ro) ro = this.rangeObservers = SC.CoreSet.create();
|
71
|
+
ro.add(observer);
|
72
|
+
return this ;
|
73
|
+
},
|
74
|
+
|
75
|
+
_TMP_OUT: [],
|
76
|
+
|
66
77
|
// Flush the queue. Attempt to add any saved observers.
|
67
|
-
flush: function() {
|
78
|
+
flush: function(object) {
|
79
|
+
|
80
|
+
// flush any observers that we tried to setup but didn't have a path yet
|
68
81
|
var oldQueue = this.queue ;
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
82
|
+
if (oldQueue && oldQueue.length > 0) {
|
83
|
+
var newQueue = (this.queue = []) ;
|
84
|
+
var idx = oldQueue.length ;
|
85
|
+
while(--idx >= 0) {
|
86
|
+
var item = oldQueue[idx] ;
|
87
|
+
if (!item) continue ;
|
88
|
+
|
89
|
+
var tuple = SC.tupleForPropertyPath(item[0], item[3]);
|
90
|
+
if (tuple) {
|
91
|
+
tuple[0].addObserver(tuple[1], item[1], item[2]) ;
|
92
|
+
} else newQueue.push(item) ;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
// if this object needsRangeObserver then see if any pending range
|
97
|
+
// observers need it.
|
98
|
+
if (object._kvo_needsRangeObserver) {
|
99
|
+
var set = this.rangeObservers,
|
100
|
+
len = set ? set.get('length') : 0,
|
101
|
+
out = this._TMP_OUT,
|
102
|
+
ro;
|
103
|
+
|
104
|
+
for(idx=0;idx<len;idx++) {
|
105
|
+
ro = set[idx]; // get the range observer
|
106
|
+
if (ro.setupPending(object)) {
|
107
|
+
out.push(ro); // save to remove later
|
108
|
+
}
|
109
|
+
}
|
74
110
|
|
75
|
-
|
76
|
-
if (
|
77
|
-
|
78
|
-
|
111
|
+
// remove any that have setup
|
112
|
+
if (out.length > 0) set.removeEach(out);
|
113
|
+
out.length = 0; // reset
|
114
|
+
object._kvo_needsRangeObserver = NO ;
|
79
115
|
}
|
116
|
+
|
80
117
|
},
|
81
118
|
|
82
|
-
|
83
|
-
_pending: SC.
|
119
|
+
isObservingSuspended: 0,
|
120
|
+
_pending: SC.CoreSet.create(),
|
84
121
|
|
85
122
|
objectHasPendingChanges: function(obj) {
|
86
123
|
this._pending.add(obj) ; // save for later
|
@@ -97,10 +134,13 @@ SC.Observers = {
|
|
97
134
|
var pending ;
|
98
135
|
if(--this.isObservingSuspended <= 0) {
|
99
136
|
pending = this._pending ;
|
100
|
-
this._pending = SC.
|
101
|
-
|
102
|
-
|
137
|
+
this._pending = SC.CoreSet.create() ;
|
138
|
+
|
139
|
+
var idx, len = pending.length;
|
140
|
+
for(idx=0;idx<len;idx++) {
|
141
|
+
pending[idx]._notifyPropertyObservers() ;
|
103
142
|
}
|
143
|
+
pending.clear();
|
104
144
|
pending = null ;
|
105
145
|
}
|
106
146
|
}
|
@@ -21,19 +21,27 @@ SC._ObserverSet = {
|
|
21
21
|
|
22
22
|
// adds the named target/method observer to the set. The method must be
|
23
23
|
// a function, not a string..
|
24
|
-
add: function(target, method) {
|
24
|
+
add: function(target, method, context) {
|
25
25
|
var targetGuid = (target) ? SC.guidFor(target) : "__this__";
|
26
26
|
|
27
27
|
// get the set of methods
|
28
28
|
var methods = this[targetGuid] ;
|
29
29
|
if (!methods) {
|
30
|
-
methods = this[targetGuid] = SC.
|
30
|
+
methods = this[targetGuid] = SC.CoreSet.create() ;
|
31
31
|
methods.target = target ;
|
32
32
|
methods.isTargetSet = YES ; // used for getMembers().
|
33
33
|
this.targets++ ;
|
34
34
|
}
|
35
|
-
|
36
35
|
methods.add(method) ;
|
36
|
+
|
37
|
+
// context is really useful sometimes but not used that often so this
|
38
|
+
// implementation is intentionally lazy.
|
39
|
+
if (context !== undefined) {
|
40
|
+
var contexts = methods.contexts ;
|
41
|
+
if (!context) contexts = {};
|
42
|
+
contexts[SC.guidFor(method)] = context ;
|
43
|
+
}
|
44
|
+
|
37
45
|
this._membersCacheIsValid = NO ;
|
38
46
|
},
|
39
47
|
|
@@ -53,16 +61,21 @@ SC._ObserverSet = {
|
|
53
61
|
if (methods.length <= 0) {
|
54
62
|
methods.target = null;
|
55
63
|
methods.isTargetSet = NO ;
|
64
|
+
methods.contexts = null ;
|
56
65
|
delete this[targetGuid] ;
|
57
66
|
this.targets-- ;
|
67
|
+
|
68
|
+
} else if (methods.contexts) {
|
69
|
+
delete methods.contexts[SC.guidFor(method)];
|
58
70
|
}
|
59
|
-
|
71
|
+
|
60
72
|
this._membersCacheIsValid = NO;
|
61
73
|
|
62
74
|
return YES ;
|
63
75
|
},
|
64
76
|
|
65
77
|
// Invokes the target/method pairs in the receiver. Used by SC.RunLoop
|
78
|
+
// Note: does not support context
|
66
79
|
invokeMethods: function() {
|
67
80
|
// iterate through the set, look for sets.
|
68
81
|
for(var key in this) {
|
@@ -93,7 +106,17 @@ SC._ObserverSet = {
|
|
93
106
|
if (value && value.isTargetSet) {
|
94
107
|
var idx = value.length;
|
95
108
|
var target = value.target ;
|
96
|
-
|
109
|
+
|
110
|
+
// slightly slower - only do if we have contexts
|
111
|
+
var contexts = value.contexts ;
|
112
|
+
if (contexts) {
|
113
|
+
while(--idx>=0) {
|
114
|
+
var method = value[idx] ;
|
115
|
+
ret.push([target, method, contexts[SC.guidFor(method)]]) ;
|
116
|
+
}
|
117
|
+
} else {
|
118
|
+
while(--idx>=0) ret.push([target, value[idx]]);
|
119
|
+
}
|
97
120
|
}
|
98
121
|
}
|
99
122
|
|
@@ -110,6 +133,7 @@ SC._ObserverSet = {
|
|
110
133
|
if (oldSet && oldSet.isTargetSet) {
|
111
134
|
newSet = oldSet.clone();
|
112
135
|
newSet.target = oldSet.target ;
|
136
|
+
if (oldSet.contexts) newSet.contexts = SC.clone(oldSet.contexts);
|
113
137
|
ret[key] = newSet ;
|
114
138
|
}
|
115
139
|
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore Costello - Property Observing Library
|
3
|
+
// Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
|
4
|
+
// Portions ©2008-2009 Apple, Inc. All rights reserved.
|
5
|
+
// License: Licened under MIT license (see license.js)
|
6
|
+
// ==========================================================================
|
7
|
+
|
8
|
+
/**
|
9
|
+
The SC.ObservableProtocol defines optional methods you can implement on your
|
10
|
+
objects. They will be used if defined but are not required for observing to
|
11
|
+
work.
|
12
|
+
*/
|
13
|
+
SC.ObservableProtocol = {
|
14
|
+
|
15
|
+
/**
|
16
|
+
Generic property observer called whenever a property on the receiver
|
17
|
+
changes.
|
18
|
+
|
19
|
+
If you need to observe a large number of properties on your object, it
|
20
|
+
is sometimes more efficient to implement this observer only and then to
|
21
|
+
handle requests yourself. Although this observer will be triggered
|
22
|
+
more often than an observer registered on a specific property, it also
|
23
|
+
does not need to be registered which can make it faster to setup your
|
24
|
+
object instance.
|
25
|
+
|
26
|
+
You will often implement this observer using a switch statement on the
|
27
|
+
key parameter, taking appropriate action.
|
28
|
+
|
29
|
+
@param observer {null} no longer used; usually null
|
30
|
+
@param target {Object} the target of the change. usually this
|
31
|
+
@param key {String} the name of the property that changed
|
32
|
+
@param value {Object} the new value of the property.
|
33
|
+
@param revision {Number} a revision you can use to quickly detect changes.
|
34
|
+
@returns {void}
|
35
|
+
*/
|
36
|
+
propertyObserver: function(observer,target,key,value, revision) {
|
37
|
+
|
38
|
+
}
|
39
|
+
|
40
|
+
};
|
@@ -12,7 +12,7 @@ require('system/object') ;
|
|
12
12
|
the console. This should be disabled in production code. Note that you
|
13
13
|
can also enable this from the console or temporarily.
|
14
14
|
*/
|
15
|
-
SC.
|
15
|
+
SC.LOG_BINDINGS = NO ;
|
16
16
|
|
17
17
|
/**
|
18
18
|
Performance paramter. This will benchmark the time spent firing each
|
@@ -334,6 +334,7 @@ SC.Binding = {
|
|
334
334
|
if (this.isConnected) return this ;
|
335
335
|
this.isConnected = YES ;
|
336
336
|
this._connectionPending = YES ; // its connected but not really...
|
337
|
+
this._syncOnConnect = YES ;
|
337
338
|
SC.Binding._connectQueue.add(this) ;
|
338
339
|
return this;
|
339
340
|
},
|
@@ -424,7 +425,7 @@ SC.Binding = {
|
|
424
425
|
the binding as dirty if the value has changed.
|
425
426
|
*/
|
426
427
|
fromPropertyDidChange: function(target, key) {
|
427
|
-
var v = target.get(key) ;
|
428
|
+
var v = target ? target.get(key) : null;
|
428
429
|
|
429
430
|
//console.log("fromPropertyDidChange: %@ v = %@".fmt(this, v)) ;
|
430
431
|
|
@@ -432,7 +433,7 @@ SC.Binding = {
|
|
432
433
|
// schedule to register an update.
|
433
434
|
if (v !== this._bindingValue) {
|
434
435
|
|
435
|
-
this._setBindingValue(
|
436
|
+
this._setBindingValue(target, key) ;
|
436
437
|
this._changePending = YES ;
|
437
438
|
SC.Binding._changeQueue.add(this) ; // save for later.
|
438
439
|
}
|
@@ -456,14 +457,32 @@ SC.Binding = {
|
|
456
457
|
// if the new value is different from the current binding value, then
|
457
458
|
// schedule to register an update.
|
458
459
|
if (v !== this._transformedBindingValue) {
|
459
|
-
this._setBindingValue(
|
460
|
+
this._setBindingValue(target, key) ;
|
460
461
|
this._changePending = YES ;
|
461
462
|
SC.Binding._changeQueue.add(this) ; // save for later.
|
462
463
|
}
|
463
464
|
},
|
464
465
|
|
465
|
-
|
466
|
-
|
466
|
+
/**
|
467
|
+
Saves the source location for the binding value. This will be used later
|
468
|
+
to actually update the binding value.
|
469
|
+
*/
|
470
|
+
_setBindingValue: function(source, key) {
|
471
|
+
this._bindingSource = source;
|
472
|
+
this._bindingKey = key;
|
473
|
+
},
|
474
|
+
|
475
|
+
/**
|
476
|
+
Updates the binding value from the current binding source if needed. This
|
477
|
+
should be called just before using this._bindingValue.
|
478
|
+
*/
|
479
|
+
_computeBindingValue: function() {
|
480
|
+
var source = this._bindingSource,
|
481
|
+
key = this._bindingKey,
|
482
|
+
v;
|
483
|
+
|
484
|
+
if (!source) return ; // nothing to do
|
485
|
+
this._bindingValue = v = source.getPath(key);
|
467
486
|
|
468
487
|
// apply any transforms to get the to property value also
|
469
488
|
var transforms = this._transforms;
|
@@ -482,10 +501,10 @@ SC.Binding = {
|
|
482
501
|
this._transformedBindingValue = v;
|
483
502
|
},
|
484
503
|
|
485
|
-
_connectQueue: SC.
|
486
|
-
_alternateConnectQueue: SC.
|
487
|
-
_changeQueue: SC.
|
488
|
-
_alternateChangeQueue: SC.
|
504
|
+
_connectQueue: SC.CoreSet.create(),
|
505
|
+
_alternateConnectQueue: SC.CoreSet.create(),
|
506
|
+
_changeQueue: SC.CoreSet.create(),
|
507
|
+
_alternateChangeQueue: SC.CoreSet.create(),
|
489
508
|
_changePending: NO,
|
490
509
|
|
491
510
|
/**
|
@@ -498,9 +517,10 @@ SC.Binding = {
|
|
498
517
|
// don't allow flushing more than one at a time
|
499
518
|
if (this._isFlushing) return NO;
|
500
519
|
this._isFlushing = YES ;
|
520
|
+
SC.Observers.suspendPropertyObserving();
|
501
521
|
|
502
522
|
var didFlush = NO ;
|
503
|
-
var log = SC.
|
523
|
+
var log = SC.LOG_BINDINGS ;
|
504
524
|
|
505
525
|
// connect any bindings
|
506
526
|
var queue, binding ;
|
@@ -534,6 +554,8 @@ SC.Binding = {
|
|
534
554
|
|
535
555
|
// clean up
|
536
556
|
this._isFlushing = NO ;
|
557
|
+
SC.Observers.resumePropertyObserving();
|
558
|
+
|
537
559
|
return didFlush ;
|
538
560
|
},
|
539
561
|
|
@@ -546,11 +568,12 @@ SC.Binding = {
|
|
546
568
|
|
547
569
|
// compute the binding targets if needed.
|
548
570
|
this._computeBindingTargets() ;
|
571
|
+
this._computeBindingValue();
|
549
572
|
|
550
573
|
var v = this._bindingValue ;
|
551
574
|
var tv = this._transformedBindingValue ;
|
552
575
|
var bench = SC.BENCHMARK_BINDING_NOTIFICATIONS ;
|
553
|
-
var log = SC.
|
576
|
+
var log = SC.LOG_BINDINGS ;
|
554
577
|
|
555
578
|
// the from property value will always be the binding value, update if
|
556
579
|
// needed.
|
@@ -601,7 +624,7 @@ SC.Binding = {
|
|
601
624
|
// if the new value is different from the current binding value, then
|
602
625
|
// schedule to register an update.
|
603
626
|
if (v !== this._bindingValue) {
|
604
|
-
this._setBindingValue(
|
627
|
+
this._setBindingValue(target, key) ;
|
605
628
|
this._changePending = YES ;
|
606
629
|
SC.Binding._changeQueue.add(this) ; // save for later.
|
607
630
|
}
|
@@ -773,8 +796,9 @@ SC.Binding = {
|
|
773
796
|
placeholder = SC.MULTIPLE_PLACEHOLDER ;
|
774
797
|
}
|
775
798
|
return this.from(fromPath).transform(function(value, isForward) {
|
776
|
-
if (
|
777
|
-
|
799
|
+
if (value && value.isEnumerable) {
|
800
|
+
var len = value.get('length');
|
801
|
+
value = (len>1) ? placeholder : (len<=0) ? null : value.firstObject();
|
778
802
|
}
|
779
803
|
return value ;
|
780
804
|
}) ;
|
@@ -0,0 +1,1166 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore Costello - Property Observing Library
|
3
|
+
// Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
|
4
|
+
// Portions ©2008-2009 Apple, Inc. All rights reserved.
|
5
|
+
// License: Licened under MIT license (see license.js)
|
6
|
+
// ==========================================================================
|
7
|
+
|
8
|
+
sc_require('mixins/enumerable') ;
|
9
|
+
sc_require('mixins/observable') ;
|
10
|
+
sc_require('mixins/freezable');
|
11
|
+
sc_require('mixins/copyable');
|
12
|
+
|
13
|
+
/**
|
14
|
+
@class
|
15
|
+
|
16
|
+
A collection of ranges. You can use an IndexSet to keep track of non-
|
17
|
+
continuous ranges of items in a parent array. IndexSet's are used for
|
18
|
+
selection, for managing invalidation ranges and other data-propogation.
|
19
|
+
|
20
|
+
h2. Examples
|
21
|
+
|
22
|
+
{{{
|
23
|
+
var set = SC.IndexSet.create(ranges) ;
|
24
|
+
set.contains(index);
|
25
|
+
set.add(index, length);
|
26
|
+
set.remove(index, length);
|
27
|
+
|
28
|
+
// uses a backing SC.Array object to return each index
|
29
|
+
set.forEach(function(object) { .. })
|
30
|
+
|
31
|
+
// returns the index
|
32
|
+
set.forEachIndex(function(index) { ... });
|
33
|
+
|
34
|
+
// returns ranges
|
35
|
+
set.forEachRange(function(start, length) { .. });
|
36
|
+
}}}
|
37
|
+
|
38
|
+
h2. Implementation Notes
|
39
|
+
|
40
|
+
An IndexSet stores indices on the object. A positive value great than the
|
41
|
+
index tells you the end of an occupied range. A negative values tells you
|
42
|
+
the end of an empty range. A value less than the index is a search
|
43
|
+
accelerator. It tells you the start of the nearest range.
|
44
|
+
|
45
|
+
@extends Object
|
46
|
+
@extends SC.Enumerable
|
47
|
+
@extends SC.Observable
|
48
|
+
@extends SC.Copyable
|
49
|
+
@extends SC.Freezable
|
50
|
+
@since SproutCore 1.0
|
51
|
+
*/
|
52
|
+
SC.IndexSet = SC.mixin({},
|
53
|
+
SC.Enumerable, SC.Observable, SC.Freezable, SC.Copyable,
|
54
|
+
/** @scope SC.IndexSet.prototype */ {
|
55
|
+
|
56
|
+
/** @private
|
57
|
+
Walks a content array and copies its contents to a new array. For large
|
58
|
+
content arrays this is faster than using slice()
|
59
|
+
*/
|
60
|
+
_sc_sliceContent: function(c) {
|
61
|
+
if (c.length < 1000) return c.slice(); // use native when faster
|
62
|
+
var cur = 0, ret = [], next = c[0];
|
63
|
+
while(next !== 0) {
|
64
|
+
ret[cur] = next ;
|
65
|
+
cur = (next<0) ? (0-next) : next ;
|
66
|
+
next = c[cur];
|
67
|
+
}
|
68
|
+
ret[cur] = 0;
|
69
|
+
this._hint(0, cur, ret); // hints are not copied manually - add them
|
70
|
+
return ret ;
|
71
|
+
},
|
72
|
+
|
73
|
+
/**
|
74
|
+
To create a set, pass either a start and index or another IndexSet.
|
75
|
+
*/
|
76
|
+
create: function(start, length) {
|
77
|
+
var ret = SC.beget(this);
|
78
|
+
ret.initObservable();
|
79
|
+
|
80
|
+
// optimized method to clone an index set.
|
81
|
+
if (start && start.isIndexSet) {
|
82
|
+
ret._content = this._sc_sliceContent(start._content);
|
83
|
+
ret.max = start.max;
|
84
|
+
ret.length = start.length;
|
85
|
+
ret.source = start.source ;
|
86
|
+
|
87
|
+
// otherwise just do a regular add
|
88
|
+
} else {
|
89
|
+
ret._content = [0];
|
90
|
+
if (start !== undefined) ret.add(start, length);
|
91
|
+
}
|
92
|
+
return ret ;
|
93
|
+
},
|
94
|
+
|
95
|
+
isIndexSet: YES,
|
96
|
+
|
97
|
+
HINT_SIZE: 256,
|
98
|
+
|
99
|
+
/**
|
100
|
+
Total number of indexes contained in the set
|
101
|
+
|
102
|
+
@type number
|
103
|
+
*/
|
104
|
+
length: 0,
|
105
|
+
|
106
|
+
/**
|
107
|
+
One greater than the largest index currently stored in the set. This
|
108
|
+
is sometimes useful when determining the total range of items covering
|
109
|
+
the index set.
|
110
|
+
*/
|
111
|
+
max: 0,
|
112
|
+
|
113
|
+
/**
|
114
|
+
The first index included in the set or -1.
|
115
|
+
|
116
|
+
@property
|
117
|
+
@type {Number}
|
118
|
+
*/
|
119
|
+
min: function() {
|
120
|
+
var content = this._content,
|
121
|
+
cur = content[0];
|
122
|
+
return (cur === 0) ? -1 : (cur>0) ? 0 : Math.abs(cur);
|
123
|
+
|
124
|
+
}.property('[]').cacheable(),
|
125
|
+
|
126
|
+
firstObject: function() {
|
127
|
+
return (this.get('length')>0) ? this.get('min') : undefined;
|
128
|
+
}.property(),
|
129
|
+
|
130
|
+
/**
|
131
|
+
Returns the starting index of the nearest range for the specified
|
132
|
+
index.
|
133
|
+
|
134
|
+
@param {Number} index
|
135
|
+
@returns {Number} starting index
|
136
|
+
*/
|
137
|
+
rangeStartForIndex: function(index) {
|
138
|
+
var content = this._content,
|
139
|
+
max = this.get('max'),
|
140
|
+
ret, next, accel;
|
141
|
+
|
142
|
+
// fast cases
|
143
|
+
if (index >= max) return max ;
|
144
|
+
if (Math.abs(content[index]) > index) return index ; // we hit a border
|
145
|
+
|
146
|
+
// use accelerator to find nearest content range
|
147
|
+
accel = index - (index % SC.IndexSet.HINT_SIZE);
|
148
|
+
ret = content[accel];
|
149
|
+
if (ret<0 || ret>index) ret = accel;
|
150
|
+
next = Math.abs(content[ret]);
|
151
|
+
|
152
|
+
// now step forward through ranges until we find one that includes the
|
153
|
+
// index.
|
154
|
+
while (next < index) {
|
155
|
+
ret = next ;
|
156
|
+
next = Math.abs(content[ret]);
|
157
|
+
}
|
158
|
+
return ret ;
|
159
|
+
},
|
160
|
+
|
161
|
+
/**
|
162
|
+
Returns YES if the passed index set contains the exact same indexes as
|
163
|
+
the receiver. If you pass any object other than an index set, returns NO.
|
164
|
+
|
165
|
+
@param {Object} obj another object.
|
166
|
+
@returns {Boolean}
|
167
|
+
*/
|
168
|
+
isEqual: function(obj) {
|
169
|
+
|
170
|
+
// optimize for some special cases
|
171
|
+
if (obj === this) return YES ;
|
172
|
+
if (!obj || !obj.isIndexSet || (obj.max !== this.max) || (obj.length !== this.length)) return NO;
|
173
|
+
|
174
|
+
// ok, now we need to actually compare the ranges of the two.
|
175
|
+
var lcontent = this._content,
|
176
|
+
rcontent = obj._content,
|
177
|
+
cur = 0,
|
178
|
+
next = lcontent[cur];
|
179
|
+
|
180
|
+
do {
|
181
|
+
if (rcontent[cur] !== next) return NO ;
|
182
|
+
cur = Math.abs(next) ;
|
183
|
+
next = lcontent[cur];
|
184
|
+
} while (cur !== 0);
|
185
|
+
return YES ;
|
186
|
+
},
|
187
|
+
|
188
|
+
/**
|
189
|
+
Returns the first index in the set before the passed index or null if
|
190
|
+
there are no previous indexes in the set.
|
191
|
+
|
192
|
+
@param {Number} index index to check
|
193
|
+
@returns {Number} index or -1
|
194
|
+
*/
|
195
|
+
indexBefore: function(index) {
|
196
|
+
|
197
|
+
if (index===0) return -1; // fast path
|
198
|
+
index--; // start with previous index
|
199
|
+
|
200
|
+
var content = this._content,
|
201
|
+
max = this.get('max'),
|
202
|
+
start = this.rangeStartForIndex(index);
|
203
|
+
if (!content) return null;
|
204
|
+
|
205
|
+
// loop backwards until we find a range that is in the set.
|
206
|
+
while((start===max) || (content[start]<0)) {
|
207
|
+
if (start === 0) return -1 ; // nothing before; just quit
|
208
|
+
index = start -1 ;
|
209
|
+
start = this.rangeStartForIndex(index);
|
210
|
+
}
|
211
|
+
|
212
|
+
return index;
|
213
|
+
},
|
214
|
+
|
215
|
+
/**
|
216
|
+
Returns the first index in the set after the passed index or null if
|
217
|
+
there are no additional indexes in the set.
|
218
|
+
|
219
|
+
@param {Number} index index to check
|
220
|
+
@returns {Number} index or -1
|
221
|
+
*/
|
222
|
+
indexAfter: function(index) {
|
223
|
+
var content = this._content,
|
224
|
+
max = this.get('max'),
|
225
|
+
start, next ;
|
226
|
+
if (!content || (index>=max)) return -1; // fast path
|
227
|
+
index++; // start with next index
|
228
|
+
|
229
|
+
|
230
|
+
// loop forwards until we find a range that is in the set.
|
231
|
+
start = this.rangeStartForIndex(index);
|
232
|
+
next = content[start];
|
233
|
+
while(next<0) {
|
234
|
+
if (next === 0) return -1 ; //nothing after; just quit
|
235
|
+
index = start = Math.abs(next);
|
236
|
+
next = content[start];
|
237
|
+
}
|
238
|
+
|
239
|
+
return index;
|
240
|
+
},
|
241
|
+
|
242
|
+
/**
|
243
|
+
Returns YES if the index set contains the named index
|
244
|
+
|
245
|
+
@param {Number} start index or range
|
246
|
+
@param {Number} length optional range length
|
247
|
+
@returns {Boolean}
|
248
|
+
*/
|
249
|
+
contains: function(start, length) {
|
250
|
+
var content, cur, next, rstart, rnext;
|
251
|
+
|
252
|
+
// normalize input
|
253
|
+
if (length === undefined) {
|
254
|
+
if (start === null || start === undefined) return NO ;
|
255
|
+
|
256
|
+
if (typeof start === SC.T_NUMBER) {
|
257
|
+
length = 1 ;
|
258
|
+
|
259
|
+
// if passed an index set, check each receiver range
|
260
|
+
} else if (start && start.isIndexSet) {
|
261
|
+
if (start === this) return YES ; // optimization
|
262
|
+
|
263
|
+
content = start._content ;
|
264
|
+
cur = 0 ;
|
265
|
+
next = content[cur];
|
266
|
+
while (next !== 0) {
|
267
|
+
if ((next>0) && !this.contains(cur, next-cur)) return NO ;
|
268
|
+
cur = Math.abs(next);
|
269
|
+
next = content[cur];
|
270
|
+
}
|
271
|
+
return YES ;
|
272
|
+
|
273
|
+
} else {
|
274
|
+
length = start.length;
|
275
|
+
start = start.start;
|
276
|
+
}
|
277
|
+
}
|
278
|
+
|
279
|
+
rstart = this.rangeStartForIndex(start);
|
280
|
+
rnext = this._content[rstart];
|
281
|
+
|
282
|
+
return (rnext>0) && (rstart <= start) && (rnext >= (start+length));
|
283
|
+
},
|
284
|
+
|
285
|
+
/**
|
286
|
+
Returns YES if the index set contains any of the passed indexes. You
|
287
|
+
can pass a single index, a range or an index set.
|
288
|
+
|
289
|
+
@param {Number} start index, range, or IndexSet
|
290
|
+
@param {Number} length optional range length
|
291
|
+
@returns {Boolean}
|
292
|
+
*/
|
293
|
+
intersects: function(start, length) {
|
294
|
+
var content, cur, next, lim;
|
295
|
+
|
296
|
+
// normalize input
|
297
|
+
if (length === undefined) {
|
298
|
+
if (typeof start === SC.T_NUMBER) {
|
299
|
+
length = 1 ;
|
300
|
+
|
301
|
+
// if passed an index set, check each receiver range
|
302
|
+
} else if (start && start.isIndexSet) {
|
303
|
+
if (start === this) return YES ; // optimization
|
304
|
+
|
305
|
+
content = start._content ;
|
306
|
+
cur = 0 ;
|
307
|
+
next = content[cur];
|
308
|
+
while (next !== 0) {
|
309
|
+
if ((next>0) && this.intersects(cur, next-cur)) return YES ;
|
310
|
+
cur = Math.abs(next);
|
311
|
+
next = content[cur];
|
312
|
+
}
|
313
|
+
return NO ;
|
314
|
+
|
315
|
+
} else {
|
316
|
+
length = start.length;
|
317
|
+
start = start.start;
|
318
|
+
}
|
319
|
+
}
|
320
|
+
|
321
|
+
cur = this.rangeStartForIndex(start);
|
322
|
+
content = this._content;
|
323
|
+
next = content[cur];
|
324
|
+
lim = start + length;
|
325
|
+
while (cur < lim) {
|
326
|
+
if (next === 0) return NO; // no match and at end!
|
327
|
+
if ((next > 0) && (next > start)) return YES ; // found a match
|
328
|
+
cur = Math.abs(next);
|
329
|
+
next = content[cur];
|
330
|
+
}
|
331
|
+
return NO ; // no match
|
332
|
+
},
|
333
|
+
|
334
|
+
/**
|
335
|
+
Returns a new IndexSet without the passed range or indexes. This is a
|
336
|
+
convenience over simply cloning and removing. Does some optimizations.
|
337
|
+
|
338
|
+
@param {Number} start index, range, or IndexSet
|
339
|
+
@param {Number} length optional range length
|
340
|
+
@returns {SC.IndexSet} new index set
|
341
|
+
*/
|
342
|
+
without: function(start, length) {
|
343
|
+
if (start === this) return SC.IndexSet.create(); // just need empty set
|
344
|
+
return this.clone().remove(start, length);
|
345
|
+
},
|
346
|
+
|
347
|
+
/**
|
348
|
+
Replace the index set's current content with the passed index set. This
|
349
|
+
is faster than clearing the index set adding the values again.
|
350
|
+
|
351
|
+
@param {Number} start index, Range, or another IndexSet
|
352
|
+
@param {Number} length optional length of range.
|
353
|
+
@returns {SC.IndexSet} receiver
|
354
|
+
*/
|
355
|
+
replace: function(start, length) {
|
356
|
+
|
357
|
+
if (length === undefined) {
|
358
|
+
if (typeof start === SC.T_NUMBER) {
|
359
|
+
length = 1 ;
|
360
|
+
} else if (start && start.isIndexSet) {
|
361
|
+
this._content = this._sc_sliceContent(start._content);
|
362
|
+
this.beginPropertyChanges()
|
363
|
+
.set('max', start.max)
|
364
|
+
.set('length', start.length)
|
365
|
+
.set('source', start.source)
|
366
|
+
.enumerableContentDidChange()
|
367
|
+
.endPropertyChanges();
|
368
|
+
return this ;
|
369
|
+
|
370
|
+
} else {
|
371
|
+
length = start.length;
|
372
|
+
start = start.start;
|
373
|
+
}
|
374
|
+
}
|
375
|
+
|
376
|
+
var oldlen = this.length;
|
377
|
+
this._content.length=1;
|
378
|
+
this._content[0] = 0;
|
379
|
+
this.length = this.max = 0 ; // reset without notifying since add()
|
380
|
+
return this.add(start, length);
|
381
|
+
},
|
382
|
+
|
383
|
+
/**
|
384
|
+
Adds the specified range of indexes to the set. You can also pass another
|
385
|
+
IndexSet to union the contents of the index set with the receiver.
|
386
|
+
|
387
|
+
@param {Number} start index, Range, or another IndexSet
|
388
|
+
@param {Number} length optional length of range.
|
389
|
+
@returns {SC.IndexSet} receiver
|
390
|
+
*/
|
391
|
+
add: function(start, length) {
|
392
|
+
|
393
|
+
if (this.isFrozen) throw SC.FROZEN_ERROR;
|
394
|
+
|
395
|
+
var content, cur, next;
|
396
|
+
|
397
|
+
// normalize IndexSet input
|
398
|
+
if (start && start.isIndexSet) {
|
399
|
+
|
400
|
+
content = start._content;
|
401
|
+
|
402
|
+
if (!content) return this; // nothing to do
|
403
|
+
|
404
|
+
cur = 0 ;
|
405
|
+
next = content[0];
|
406
|
+
while(next !== 0) {
|
407
|
+
if (next>0) this.add(cur, next-cur);
|
408
|
+
cur = next<0 ? 0-next : next;
|
409
|
+
next = content[cur];
|
410
|
+
}
|
411
|
+
return this ;
|
412
|
+
|
413
|
+
} else if (length === undefined) {
|
414
|
+
|
415
|
+
if (start === null || start === undefined) {
|
416
|
+
return this; // nothing to do
|
417
|
+
} else if (typeof start === SC.T_NUMBER) {
|
418
|
+
length = 1 ;
|
419
|
+
} else {
|
420
|
+
length = start.length;
|
421
|
+
start = start.start;
|
422
|
+
}
|
423
|
+
} else if (length === null) length = 1 ;
|
424
|
+
|
425
|
+
// special case - appending to end of set
|
426
|
+
var max = this.get('max'),
|
427
|
+
oldmax = max,
|
428
|
+
delta, value ;
|
429
|
+
|
430
|
+
content = this._content ;
|
431
|
+
|
432
|
+
if (start === max) {
|
433
|
+
|
434
|
+
// if adding to the end and the end is in set, merge.
|
435
|
+
if (start > 0) {
|
436
|
+
cur = this.rangeStartForIndex(start-1);
|
437
|
+
next = content[cur];
|
438
|
+
|
439
|
+
// just extend range at end
|
440
|
+
if (next > 0) {
|
441
|
+
delete content[max]; // no 0
|
442
|
+
content[cur] = max = start + length ;
|
443
|
+
start = cur ;
|
444
|
+
|
445
|
+
// previous range was not in set, just tack onto the end
|
446
|
+
} else {
|
447
|
+
content[max] = max = start + length;
|
448
|
+
}
|
449
|
+
} else {
|
450
|
+
content[start] = max = length;
|
451
|
+
}
|
452
|
+
|
453
|
+
content[max] = 0 ;
|
454
|
+
this.set('max', max);
|
455
|
+
this.set('length', this.length + length) ;
|
456
|
+
length = max - start ;
|
457
|
+
|
458
|
+
} else if (start > max) {
|
459
|
+
content[max] = 0-start; // empty!
|
460
|
+
content[start] = start+length ;
|
461
|
+
content[start+length] = 0; // set end
|
462
|
+
this.set('max', start + length) ;
|
463
|
+
this.set('length', this.length + length) ;
|
464
|
+
|
465
|
+
// affected range goes from starting range to end of content.
|
466
|
+
length = start + length - max ;
|
467
|
+
start = max ;
|
468
|
+
|
469
|
+
// otherwise, merge into existing range
|
470
|
+
} else {
|
471
|
+
|
472
|
+
// find nearest starting range. split or join that range
|
473
|
+
cur = this.rangeStartForIndex(start);
|
474
|
+
next = content[cur];
|
475
|
+
max = start + length ;
|
476
|
+
delta = 0 ;
|
477
|
+
|
478
|
+
// we are right on a boundary and we had a range or were the end, then
|
479
|
+
// go back one more.
|
480
|
+
if ((start>0) && (cur === start) && (next <= 0)) {
|
481
|
+
cur = this.rangeStartForIndex(start-1);
|
482
|
+
next = content[cur] ;
|
483
|
+
}
|
484
|
+
|
485
|
+
// previous range is not in set. splice it here
|
486
|
+
if (next < 0) {
|
487
|
+
content[cur] = 0-start ;
|
488
|
+
|
489
|
+
// if previous range extends beyond this range, splice afterwards also
|
490
|
+
if (Math.abs(next) > max) {
|
491
|
+
content[start] = 0-max;
|
492
|
+
content[max] = next ;
|
493
|
+
} else content[start] = next;
|
494
|
+
|
495
|
+
// previous range is in set. merge the ranges
|
496
|
+
} else {
|
497
|
+
start = cur ;
|
498
|
+
if (next > max) {
|
499
|
+
delta -= next - max ;
|
500
|
+
max = next ;
|
501
|
+
}
|
502
|
+
}
|
503
|
+
|
504
|
+
// at this point there should be clean starting point for the range.
|
505
|
+
// just walk the ranges, adding up the length delta and then removing
|
506
|
+
// the range until we find a range that passes last
|
507
|
+
cur = start;
|
508
|
+
while (cur < max) {
|
509
|
+
// get next boundary. splice if needed - if value is 0, we are at end
|
510
|
+
// just skip to last
|
511
|
+
value = content[cur];
|
512
|
+
if (value === 0) {
|
513
|
+
content[max] = 0;
|
514
|
+
next = max ;
|
515
|
+
delta += max - cur ;
|
516
|
+
} else {
|
517
|
+
next = Math.abs(value);
|
518
|
+
if (next > max) {
|
519
|
+
content[max] = value ;
|
520
|
+
next = max ;
|
521
|
+
}
|
522
|
+
|
523
|
+
// ok, cur range is entirely inside top range.
|
524
|
+
// add to delta if needed
|
525
|
+
if (value < 0) delta += next - cur ;
|
526
|
+
}
|
527
|
+
|
528
|
+
delete content[cur] ; // and remove range
|
529
|
+
cur = next;
|
530
|
+
}
|
531
|
+
|
532
|
+
// cur should always === last now. if the following range is in set,
|
533
|
+
// merge in also - don't adjust delta because these aren't new indexes
|
534
|
+
if ((cur = content[max]) > 0) {
|
535
|
+
delete content[max];
|
536
|
+
max = cur ;
|
537
|
+
}
|
538
|
+
|
539
|
+
// finally set my own range.
|
540
|
+
content[start] = max ;
|
541
|
+
if (max > oldmax) this.set('max', max) ;
|
542
|
+
|
543
|
+
// adjust length
|
544
|
+
this.set('length', this.get('length') + delta);
|
545
|
+
|
546
|
+
// compute hint range
|
547
|
+
length = max - start ;
|
548
|
+
}
|
549
|
+
|
550
|
+
this._hint(start, length);
|
551
|
+
if (delta !== 0) this.enumerableContentDidChange();
|
552
|
+
return this;
|
553
|
+
},
|
554
|
+
|
555
|
+
/**
|
556
|
+
Removes the specified range of indexes from the set
|
557
|
+
|
558
|
+
@param {Number} start index, Range, or IndexSet
|
559
|
+
@param {Number} length optional length of range.
|
560
|
+
@returns {SC.IndexSet} receiver
|
561
|
+
*/
|
562
|
+
remove: function(start, length) {
|
563
|
+
|
564
|
+
if (this.isFrozen) throw SC.FROZEN_ERROR;
|
565
|
+
|
566
|
+
// normalize input
|
567
|
+
if (length === undefined) {
|
568
|
+
if (start === null || start === undefined) {
|
569
|
+
return this; // nothing to do
|
570
|
+
|
571
|
+
} else if (typeof start === SC.T_NUMBER) {
|
572
|
+
length = 1 ;
|
573
|
+
|
574
|
+
// if passed an index set, just add each range in the index set.
|
575
|
+
} else if (start.isIndexSet) {
|
576
|
+
start.forEachRange(this.remove, this);
|
577
|
+
return this;
|
578
|
+
|
579
|
+
} else {
|
580
|
+
length = start.length;
|
581
|
+
start = start.start;
|
582
|
+
}
|
583
|
+
}
|
584
|
+
|
585
|
+
// special case - appending to end of set
|
586
|
+
var max = this.get('max'),
|
587
|
+
oldmax = max,
|
588
|
+
content = this._content,
|
589
|
+
cur, next, delta, value, last ;
|
590
|
+
|
591
|
+
// if we're past the end, do nothing.
|
592
|
+
if (start >= max) return this;
|
593
|
+
|
594
|
+
// find nearest starting range. split or join that range
|
595
|
+
cur = this.rangeStartForIndex(start);
|
596
|
+
next = content[cur];
|
597
|
+
last = start + length ;
|
598
|
+
delta = 0 ;
|
599
|
+
|
600
|
+
// we are right on a boundary and we had a range or were the end, then
|
601
|
+
// go back one more.
|
602
|
+
if ((start>0) && (cur === start) && (next > 0)) {
|
603
|
+
cur = this.rangeStartForIndex(start-1);
|
604
|
+
next = content[cur] ;
|
605
|
+
}
|
606
|
+
|
607
|
+
// previous range is in set. splice it here
|
608
|
+
if (next > 0) {
|
609
|
+
content[cur] = start ;
|
610
|
+
|
611
|
+
// if previous range extends beyond this range, splice afterwards also
|
612
|
+
if (next > last) {
|
613
|
+
content[start] = last;
|
614
|
+
content[last] = next ;
|
615
|
+
} else content[start] = next;
|
616
|
+
|
617
|
+
// previous range is not in set. merge the ranges
|
618
|
+
} else {
|
619
|
+
start = cur ;
|
620
|
+
next = Math.abs(next);
|
621
|
+
if (next > last) {
|
622
|
+
last = next ;
|
623
|
+
}
|
624
|
+
}
|
625
|
+
|
626
|
+
// at this point there should be clean starting point for the range.
|
627
|
+
// just walk the ranges, adding up the length delta and then removing
|
628
|
+
// the range until we find a range that passes last
|
629
|
+
cur = start;
|
630
|
+
while (cur < last) {
|
631
|
+
// get next boundary. splice if needed - if value is 0, we are at end
|
632
|
+
// just skip to last
|
633
|
+
value = content[cur];
|
634
|
+
if (value === 0) {
|
635
|
+
content[last] = 0;
|
636
|
+
next = last ;
|
637
|
+
|
638
|
+
} else {
|
639
|
+
next = Math.abs(value);
|
640
|
+
if (next > last) {
|
641
|
+
content[last] = value ;
|
642
|
+
next = last ;
|
643
|
+
}
|
644
|
+
|
645
|
+
// ok, cur range is entirely inside top range.
|
646
|
+
// add to delta if needed
|
647
|
+
if (value > 0) delta += next - cur ;
|
648
|
+
}
|
649
|
+
|
650
|
+
delete content[cur] ; // and remove range
|
651
|
+
cur = next;
|
652
|
+
}
|
653
|
+
|
654
|
+
// cur should always === last now. if the following range is not in set,
|
655
|
+
// merge in also - don't adjust delta because these aren't new indexes
|
656
|
+
if ((cur = content[last]) < 0) {
|
657
|
+
delete content[last];
|
658
|
+
last = Math.abs(cur) ;
|
659
|
+
}
|
660
|
+
|
661
|
+
// set my own range - if the next item is 0, then clear it.
|
662
|
+
if (content[last] === 0) {
|
663
|
+
delete content[last];
|
664
|
+
content[start] = 0 ;
|
665
|
+
this.set('max', start); //max has changed
|
666
|
+
|
667
|
+
} else {
|
668
|
+
content[start] = 0-last ;
|
669
|
+
}
|
670
|
+
|
671
|
+
// adjust length
|
672
|
+
this.set('length', this.get('length') - delta);
|
673
|
+
|
674
|
+
// compute hint range
|
675
|
+
length = last - start ;
|
676
|
+
|
677
|
+
this._hint(start, length);
|
678
|
+
if (delta !== 0) this.enumerableContentDidChange();
|
679
|
+
return this;
|
680
|
+
},
|
681
|
+
|
682
|
+
/** @private
|
683
|
+
iterates through a named range, setting hints every HINT_SIZE indexes
|
684
|
+
pointing to the nearest range start. The passed range must start on a
|
685
|
+
range boundary. It can end anywhere.
|
686
|
+
*/
|
687
|
+
_hint: function(start, length, content) {
|
688
|
+
if (content === undefined) content = this._content;
|
689
|
+
|
690
|
+
var skip = SC.IndexSet.HINT_SIZE,
|
691
|
+
next = Math.abs(content[start]), // start of next range
|
692
|
+
loc = start - (start % skip) + skip, // next hint loc
|
693
|
+
lim = start + length ; // stop
|
694
|
+
|
695
|
+
while (loc < lim) {
|
696
|
+
// make sure we are in current rnage
|
697
|
+
while ((next !== 0) && (next <= loc)) {
|
698
|
+
start = next ;
|
699
|
+
next = Math.abs(content[start]) ;
|
700
|
+
}
|
701
|
+
|
702
|
+
// past end
|
703
|
+
if (next === 0) {
|
704
|
+
delete content[loc];
|
705
|
+
|
706
|
+
// do not change if on actual boundary
|
707
|
+
} else if (loc !== start) {
|
708
|
+
content[loc] = start ; // set hint
|
709
|
+
}
|
710
|
+
|
711
|
+
loc += skip;
|
712
|
+
}
|
713
|
+
},
|
714
|
+
|
715
|
+
/**
|
716
|
+
Clears the set
|
717
|
+
*/
|
718
|
+
clear: function() {
|
719
|
+
if (this.isFrozen) throw SC.FROZEN_ERROR;
|
720
|
+
|
721
|
+
var oldlen = this.length;
|
722
|
+
this._content.length=1;
|
723
|
+
this._content[0] = 0;
|
724
|
+
this.set('length', 0).set('max', 0);
|
725
|
+
if (oldlen > 0) this.enumerableContentDidChange();
|
726
|
+
},
|
727
|
+
|
728
|
+
/**
|
729
|
+
Add all the ranges in the passed array.
|
730
|
+
*/
|
731
|
+
addEach: function(objects) {
|
732
|
+
if (this.isFrozen) throw SC.FROZEN_ERROR;
|
733
|
+
|
734
|
+
var idx = objects.get('length') ;
|
735
|
+
if (objects.objectAt) {
|
736
|
+
while(--idx >= 0) this.add(objects.objectAt(idx)) ;
|
737
|
+
} else {
|
738
|
+
while(--idx >= 0) this.add(objects[idx]) ;
|
739
|
+
}
|
740
|
+
return this ;
|
741
|
+
},
|
742
|
+
|
743
|
+
/**
|
744
|
+
Removes all the ranges in the passed array.
|
745
|
+
*/
|
746
|
+
removeEach: function(objects) {
|
747
|
+
if (this.isFrozen) throw SC.FROZEN_ERROR;
|
748
|
+
|
749
|
+
var idx = objects.get('length') ;
|
750
|
+
if (objects.objectAt) {
|
751
|
+
while(--idx >= 0) this.remove(objects.objectAt(idx)) ;
|
752
|
+
} else {
|
753
|
+
while(--idx >= 0) this.remove(objects[idx]) ;
|
754
|
+
}
|
755
|
+
return this ;
|
756
|
+
},
|
757
|
+
|
758
|
+
/**
|
759
|
+
Clones the set into a new set.
|
760
|
+
*/
|
761
|
+
clone: function() {
|
762
|
+
return SC.IndexSet.create(this);
|
763
|
+
},
|
764
|
+
|
765
|
+
/**
|
766
|
+
Returns a string describing the internal range structure. Useful for
|
767
|
+
debugging.
|
768
|
+
|
769
|
+
@returns {String}
|
770
|
+
*/
|
771
|
+
inspect: function() {
|
772
|
+
var content = this._content,
|
773
|
+
len = content.length,
|
774
|
+
idx = 0,
|
775
|
+
ret = [],
|
776
|
+
item;
|
777
|
+
|
778
|
+
for(idx=0;idx<len;idx++) {
|
779
|
+
item = content[idx];
|
780
|
+
if (item !== undefined) ret.push("%@:%@".fmt(idx,item));
|
781
|
+
}
|
782
|
+
return "SC.IndexSet<%@>".fmt(ret.join(' , '));
|
783
|
+
},
|
784
|
+
|
785
|
+
/**
|
786
|
+
Invoke the callback, passing each occuppied range instead of each
|
787
|
+
index. This can be a more efficient way to iterate in some cases. The
|
788
|
+
callback should have the signature:
|
789
|
+
|
790
|
+
{{{
|
791
|
+
callback(start, length, indexSet, source) { ... }
|
792
|
+
}}}
|
793
|
+
|
794
|
+
If you pass a target as a second option, the callback will be called in
|
795
|
+
the target context.
|
796
|
+
|
797
|
+
@param {Function} callback the iterator callback
|
798
|
+
@param {Object} target the target
|
799
|
+
@returns {SC.IndexSet} receiver
|
800
|
+
*/
|
801
|
+
forEachRange: function(callback, target) {
|
802
|
+
var content = this._content,
|
803
|
+
cur = 0,
|
804
|
+
next = content[cur],
|
805
|
+
source = this.source;
|
806
|
+
|
807
|
+
if (target === undefined) target = null ;
|
808
|
+
while (next !== 0) {
|
809
|
+
if (next > 0) callback.call(target, cur, next - cur, this, source);
|
810
|
+
cur = Math.abs(next);
|
811
|
+
next = content[cur];
|
812
|
+
}
|
813
|
+
|
814
|
+
return this ;
|
815
|
+
},
|
816
|
+
|
817
|
+
/**
|
818
|
+
Invokes the callback for each index within the passed start/length range.
|
819
|
+
Otherwise works just like regular forEach().
|
820
|
+
|
821
|
+
@param {Number} start starting index
|
822
|
+
@param {Number} length length of range
|
823
|
+
@param {Function} callback
|
824
|
+
@param {Object} target
|
825
|
+
@returns {SC.IndexSet} receiver
|
826
|
+
*/
|
827
|
+
forEachIn: function(start, length, callback, target) {
|
828
|
+
var content = this._content,
|
829
|
+
cur = 0,
|
830
|
+
idx = 0,
|
831
|
+
lim = start + length,
|
832
|
+
source = this.source,
|
833
|
+
next = content[cur];
|
834
|
+
|
835
|
+
if (target === undefined) target = null ;
|
836
|
+
while (next !== 0) {
|
837
|
+
if (cur < start) cur = start ; // skip forward
|
838
|
+
while((cur < next) && (cur < lim)) {
|
839
|
+
callback.call(target, cur++, idx++, this, source);
|
840
|
+
}
|
841
|
+
|
842
|
+
if (cur >= lim) {
|
843
|
+
cur = next = 0 ;
|
844
|
+
} else {
|
845
|
+
cur = Math.abs(next);
|
846
|
+
next = content[cur];
|
847
|
+
}
|
848
|
+
}
|
849
|
+
return this ;
|
850
|
+
},
|
851
|
+
|
852
|
+
/**
|
853
|
+
Total number of indexes within the specified range.
|
854
|
+
|
855
|
+
@param {Number|SC.IndexSet} start index, range object or IndexSet
|
856
|
+
@param {Number} length optional range length
|
857
|
+
@returns {Number} count of indexes
|
858
|
+
*/
|
859
|
+
lengthIn: function(start, length) {
|
860
|
+
|
861
|
+
var ret = 0 ;
|
862
|
+
|
863
|
+
// normalize input
|
864
|
+
if (length === undefined) {
|
865
|
+
if (start === null || start === undefined) {
|
866
|
+
return 0; // nothing to do
|
867
|
+
|
868
|
+
} else if (typeof start === SC.T_NUMBER) {
|
869
|
+
length = 1 ;
|
870
|
+
|
871
|
+
// if passed an index set, just add each range in the index set.
|
872
|
+
} else if (start.isIndexSet) {
|
873
|
+
start.forEachRange(function(start, length) {
|
874
|
+
ret += this.lengthIn(start, length);
|
875
|
+
}, this);
|
876
|
+
return ret;
|
877
|
+
|
878
|
+
} else {
|
879
|
+
length = start.length;
|
880
|
+
start = start.start;
|
881
|
+
}
|
882
|
+
}
|
883
|
+
|
884
|
+
// fast path
|
885
|
+
if (this.get('length') === 0) return 0;
|
886
|
+
|
887
|
+
var content = this._content,
|
888
|
+
cur = 0,
|
889
|
+
next = content[cur],
|
890
|
+
lim = start + length ;
|
891
|
+
|
892
|
+
while (cur<lim && next !== 0) {
|
893
|
+
if (next>0) {
|
894
|
+
ret += (next>lim) ? lim-cur : next-cur;
|
895
|
+
}
|
896
|
+
cur = Math.abs(next);
|
897
|
+
next = content[cur];
|
898
|
+
}
|
899
|
+
|
900
|
+
return ret ;
|
901
|
+
},
|
902
|
+
|
903
|
+
// ..........................................................
|
904
|
+
// OBJECT API
|
905
|
+
//
|
906
|
+
|
907
|
+
/**
|
908
|
+
Optionally set the source property on an index set and then you can
|
909
|
+
iterate over the actual object values referenced by the index set. See
|
910
|
+
indexOf(), lastIndexOf(), forEachObject(), addObject() and removeObject().
|
911
|
+
*/
|
912
|
+
source: null,
|
913
|
+
|
914
|
+
/**
|
915
|
+
Returns the first index in the set that matches the passed object. You
|
916
|
+
must have a source property on the set for this to work.
|
917
|
+
|
918
|
+
@param {Object} object the object to check
|
919
|
+
@param {Number} startAt optional starting point
|
920
|
+
@returns {Number} found index or -1 if not in set
|
921
|
+
*/
|
922
|
+
indexOf: function(object, startAt) {
|
923
|
+
var source = this.source;
|
924
|
+
if (!source) throw "%@.indexOf() requires source".fmt(this);
|
925
|
+
|
926
|
+
var len = source.get('length'),
|
927
|
+
|
928
|
+
// start with the first index in the set
|
929
|
+
content = this._content,
|
930
|
+
cur = content[0]<0 ? Math.abs(content[0]) : 0,
|
931
|
+
idx ;
|
932
|
+
|
933
|
+
while(cur>=0 && cur<len) {
|
934
|
+
idx = source.indexOf(object, cur);
|
935
|
+
if (idx<0) return -1 ; // not found in source
|
936
|
+
if (this.contains(idx)) return idx; // found in source and in set.
|
937
|
+
cur = idx+1;
|
938
|
+
}
|
939
|
+
|
940
|
+
return -1; // not found
|
941
|
+
},
|
942
|
+
|
943
|
+
/**
|
944
|
+
Returns the last index in the set that matches the passed object. You
|
945
|
+
must have a source property on the set for this to work.
|
946
|
+
|
947
|
+
@param {Object} object the object to check
|
948
|
+
@param {Number} startAt optional starting point
|
949
|
+
@returns {Number} found index or -1 if not in set
|
950
|
+
*/
|
951
|
+
lastIndexOf: function(object, startAt) {
|
952
|
+
var source = this.source;
|
953
|
+
if (!source) throw "%@.lastIndexOf() requires source".fmt(this);
|
954
|
+
|
955
|
+
// start with the last index in the set
|
956
|
+
var len = source.get('length'),
|
957
|
+
cur = this.max-1,
|
958
|
+
idx ;
|
959
|
+
|
960
|
+
if (cur >= len) cur = len-1;
|
961
|
+
while (cur>=0) {
|
962
|
+
idx = source.lastIndexOf(object, cur);
|
963
|
+
if (idx<0) return -1 ; // not found in source
|
964
|
+
if (this.contains(idx)) return idx; // found in source and in set.
|
965
|
+
cur = idx+1;
|
966
|
+
}
|
967
|
+
|
968
|
+
return -1; // not found
|
969
|
+
},
|
970
|
+
|
971
|
+
/**
|
972
|
+
Iterates through the objects at each index location in the set. You must
|
973
|
+
have a source property on the set for this to work. The callback you pass
|
974
|
+
will be invoked for each object in the set with the following signature:
|
975
|
+
|
976
|
+
{{{
|
977
|
+
function callback(object, index, source, indexSet) { ... }
|
978
|
+
}}}
|
979
|
+
|
980
|
+
If you pass a target, it will be used when the callback is called.
|
981
|
+
|
982
|
+
@param {Function} callback function to invoke.
|
983
|
+
@param {Object} target optional content. otherwise uses window
|
984
|
+
@returns {SC.IndexSet} receiver
|
985
|
+
*/
|
986
|
+
forEachObject: function(callback, target) {
|
987
|
+
var source = this.source;
|
988
|
+
if (!source) throw "%@.forEachObject() requires source".fmt(this);
|
989
|
+
|
990
|
+
var content = this._content,
|
991
|
+
cur = 0,
|
992
|
+
idx = 0,
|
993
|
+
next = content[cur];
|
994
|
+
|
995
|
+
if (target === undefined) target = null ;
|
996
|
+
while (next !== 0) {
|
997
|
+
|
998
|
+
while(cur < next) {
|
999
|
+
callback.call(target, source.objectAt(cur), cur, source, this);
|
1000
|
+
cur++;
|
1001
|
+
}
|
1002
|
+
|
1003
|
+
cur = Math.abs(next);
|
1004
|
+
next = content[cur];
|
1005
|
+
}
|
1006
|
+
return this ;
|
1007
|
+
},
|
1008
|
+
|
1009
|
+
/**
|
1010
|
+
Adds all indexes where the object appears to the set. If firstOnly is
|
1011
|
+
passed, then it will find only the first index and add it. If you know
|
1012
|
+
the object only appears in the source array one time, firstOnly may make
|
1013
|
+
this method faster.
|
1014
|
+
|
1015
|
+
Requires source to work.
|
1016
|
+
|
1017
|
+
@param {Object} object the object to add
|
1018
|
+
@returns {SC.IndexSet} receiver
|
1019
|
+
*/
|
1020
|
+
addObject: function(object, firstOnly) {
|
1021
|
+
var source = this.source;
|
1022
|
+
if (!source) throw "%@.addObject() requires source".fmt(this);
|
1023
|
+
|
1024
|
+
var len = source.get('length'),
|
1025
|
+
cur = 0, idx;
|
1026
|
+
|
1027
|
+
while(cur>=0 && cur<len) {
|
1028
|
+
idx = source.indexOf(object, cur);
|
1029
|
+
if (idx >= 0) {
|
1030
|
+
this.add(idx);
|
1031
|
+
if (firstOnly) return this ;
|
1032
|
+
cur = idx++;
|
1033
|
+
} else return this ;
|
1034
|
+
}
|
1035
|
+
return this ;
|
1036
|
+
},
|
1037
|
+
|
1038
|
+
/**
|
1039
|
+
Adds any indexes matching the passed objects. If firstOnly is passed,
|
1040
|
+
then only finds the first index for each object.
|
1041
|
+
|
1042
|
+
@param {SC.Enumerable} objects the objects to add
|
1043
|
+
@returns {SC.IndexSet} receiver
|
1044
|
+
*/
|
1045
|
+
addObjects: function(objects, firstOnly) {
|
1046
|
+
objects.forEach(function(object) {
|
1047
|
+
this.addObject(object, firstOnly);
|
1048
|
+
}, this);
|
1049
|
+
return this;
|
1050
|
+
},
|
1051
|
+
|
1052
|
+
/**
|
1053
|
+
Removes all indexes where the object appears to the set. If firstOnly is
|
1054
|
+
passed, then it will find only the first index and add it. If you know
|
1055
|
+
the object only appears in the source array one time, firstOnly may make
|
1056
|
+
this method faster.
|
1057
|
+
|
1058
|
+
Requires source to work.
|
1059
|
+
|
1060
|
+
@param {Object} object the object to add
|
1061
|
+
@returns {SC.IndexSet} receiver
|
1062
|
+
*/
|
1063
|
+
removeObject: function(object, firstOnly) {
|
1064
|
+
var source = this.source;
|
1065
|
+
if (!source) throw "%@.removeObject() requires source".fmt(this);
|
1066
|
+
|
1067
|
+
var len = source.get('length'),
|
1068
|
+
cur = 0, idx;
|
1069
|
+
|
1070
|
+
while(cur>=0 && cur<len) {
|
1071
|
+
idx = source.indexOf(object, cur);
|
1072
|
+
if (idx >= 0) {
|
1073
|
+
this.remove(idx);
|
1074
|
+
if (firstOnly) return this ;
|
1075
|
+
cur = idx+1;
|
1076
|
+
} else return this ;
|
1077
|
+
}
|
1078
|
+
return this ;
|
1079
|
+
},
|
1080
|
+
|
1081
|
+
/**
|
1082
|
+
Removes any indexes matching the passed objects. If firstOnly is passed,
|
1083
|
+
then only finds the first index for each object.
|
1084
|
+
|
1085
|
+
@param {SC.Enumerable} objects the objects to add
|
1086
|
+
@returns {SC.IndexSet} receiver
|
1087
|
+
*/
|
1088
|
+
removeObjects: function(objects, firstOnly) {
|
1089
|
+
objects.forEach(function(object) {
|
1090
|
+
this.removeObject(object, firstOnly);
|
1091
|
+
}, this);
|
1092
|
+
return this;
|
1093
|
+
},
|
1094
|
+
|
1095
|
+
|
1096
|
+
// .......................................
|
1097
|
+
// PRIVATE
|
1098
|
+
//
|
1099
|
+
|
1100
|
+
/**
|
1101
|
+
Usually observing notifications from IndexSet are not useful, so
|
1102
|
+
supress them by default.
|
1103
|
+
*/
|
1104
|
+
LOG_OBSERVING: NO,
|
1105
|
+
|
1106
|
+
/** @private - optimized call to forEach() */
|
1107
|
+
forEach: function(callback, target) {
|
1108
|
+
var content = this._content,
|
1109
|
+
cur = 0,
|
1110
|
+
idx = 0,
|
1111
|
+
source = this.source,
|
1112
|
+
next = content[cur];
|
1113
|
+
|
1114
|
+
if (target === undefined) target = null ;
|
1115
|
+
while (next !== 0) {
|
1116
|
+
while(cur < next) {
|
1117
|
+
callback.call(target, cur++, idx++, this, source);
|
1118
|
+
}
|
1119
|
+
cur = Math.abs(next);
|
1120
|
+
next = content[cur];
|
1121
|
+
}
|
1122
|
+
return this ;
|
1123
|
+
},
|
1124
|
+
|
1125
|
+
/** @private - support iterators */
|
1126
|
+
nextObject: function(ignore, idx, context) {
|
1127
|
+
var content = this._content,
|
1128
|
+
next = context.next,
|
1129
|
+
max = this.get('max'); // next boundary
|
1130
|
+
|
1131
|
+
// seed.
|
1132
|
+
if (idx === null) {
|
1133
|
+
idx = next = 0 ;
|
1134
|
+
|
1135
|
+
} else if (idx >= max) {
|
1136
|
+
delete context.next; // cleanup context
|
1137
|
+
return null ; // nothing left to do
|
1138
|
+
|
1139
|
+
} else idx++; // look on next index
|
1140
|
+
|
1141
|
+
// look for next non-empty range if needed.
|
1142
|
+
if (idx === next) {
|
1143
|
+
do {
|
1144
|
+
idx = Math.abs(next);
|
1145
|
+
next = content[idx];
|
1146
|
+
} while(next < 0);
|
1147
|
+
context.next = next;
|
1148
|
+
}
|
1149
|
+
|
1150
|
+
return idx;
|
1151
|
+
},
|
1152
|
+
|
1153
|
+
toString: function() {
|
1154
|
+
var str = [];
|
1155
|
+
this.forEachRange(function(start, length) {
|
1156
|
+
str.push(length === 1 ? start : "%@..%@".fmt(start, start + length - 1));
|
1157
|
+
}, this);
|
1158
|
+
return "SC.IndexSet<%@>".fmt(str.join(',')) ;
|
1159
|
+
},
|
1160
|
+
|
1161
|
+
max: 0
|
1162
|
+
|
1163
|
+
}) ;
|
1164
|
+
|
1165
|
+
SC.IndexSet.slice = SC.IndexSet.copy = SC.IndexSet.clone ;
|
1166
|
+
SC.IndexSet.EMPTY = SC.IndexSet.create().freeze();
|