sproutcore 1.10.3.1 → 1.11.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG +4 -8
- data/VERSION.yml +2 -2
- data/lib/frameworks/sproutcore/Buildfile +5 -4
- data/lib/frameworks/sproutcore/CHANGELOG.md +274 -40
- data/lib/frameworks/sproutcore/CONTRIBUTORS.md +133 -0
- data/lib/frameworks/sproutcore/README.md +31 -144
- data/lib/frameworks/sproutcore/apps/showcase/controllers/source_tree_controller.js +9 -4
- data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +5 -0
- data/lib/frameworks/sproutcore/apps/showcase/system/views_item_content.js +1 -1
- data/lib/frameworks/sproutcore/apps/showcase/views/split_views.js +15 -2
- data/lib/frameworks/sproutcore/apps/showcase/views/stacked_views.js +1 -1
- data/lib/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +11 -1
- data/lib/frameworks/sproutcore/frameworks/ajax/mixins/websocket_delegate.js +90 -0
- data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +81 -5
- data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +23 -4
- data/lib/frameworks/sproutcore/frameworks/ajax/system/websocket.js +475 -0
- data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +149 -26
- data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/websocket.js +197 -0
- data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/xhr_response_test.js +65 -0
- data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +4 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/horizontal_stack_layout.js +232 -52
- data/lib/frameworks/sproutcore/frameworks/core_foundation/child_view_layouts/vertical_stack_layout.js +235 -49
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +23 -13
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/object.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/core.js +81 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/english.lproj/ordinal.js +17 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/{desktop/tests/views/disclosure/methods.js → core_foundation/french.lproj/ordinal.js} +7 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +2 -6
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +104 -69
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane_statechart.js +6 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/child_view_layout_protocol.js +59 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/view_transition_protocol.js +18 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/application.js +192 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/bezier_curves.js +52 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +384 -64
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/core_query.js +6 -14
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/device.js +21 -35
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +72 -36
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +90 -34
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +55 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +20 -15
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/req_anim_frame.js +9 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +763 -542
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/selection_set.js +4 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +1 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +14 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/touch.js +538 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils/rect.js +56 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +99 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/single_case.js +25 -19
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/core_tests.js +75 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/ext/number_test.js +81 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +4 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/responder_context.js +4 -4
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +19 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/color.js +36 -20
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/design_modes_test.js +83 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/makeMainPane.js +7 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/mouse_events.js +338 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/root_responder.js +14 -89
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/root_responder/touch.js +106 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/sparse_array.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/touch.js +136 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/utils/rect.js +42 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/append_remove.js +11 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/child_view.js +5 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/design_mode_test.js +457 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/pane/sendEvent.js +36 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/background_color.js +44 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/border_frame_test.js +51 -24
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/childViewLayout_test.js +176 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +46 -16
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/convertFrames.js +69 -15
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/didAppendToDocument.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layout.js +7 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutDidChange.js +30 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +376 -71
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/static_layout.js +0 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/viewDidResize.js +117 -34
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/view_states_test.js +52 -2
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +656 -42
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +159 -38
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/cursor.js +0 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/design_mode.js +206 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/enabled.js +0 -28
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +21 -6
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +372 -450
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +28 -13
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +22 -51
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/statechart.js +59 -30
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +0 -29
- data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +22 -10
- data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +42 -36
- data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +54 -3
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +178 -59
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +206 -132
- data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +214 -118
- data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +96 -13
- data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +14 -4
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +82 -42
- data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +272 -177
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/store_interaction_test.js +54 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +24 -16
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +6 -3
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/data_store.js +267 -35
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +57 -46
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +150 -53
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +57 -17
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +13 -9
- data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/many.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/simple.js +0 -0
- data/lib/frameworks/sproutcore/frameworks/{experimental/frameworks/polymorphism → datastore}/tests/models/polymorphism/single.js +12 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +20 -15
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +9 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +80 -14
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_dataSourceCallbacks.js +280 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/autonomous_pushChanges.js +232 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +31 -5
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +16 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +60 -40
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/materializeRecord.js +78 -0
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +20 -0
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/{resources → english.lproj}/strings.js +0 -0
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/french.lproj/strings.js +45 -0
- data/lib/frameworks/sproutcore/frameworks/designer/designers/object_designer.js +7 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +125 -44
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +139 -48
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/draggable.js +202 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +59 -56
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +13 -49
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +466 -305
- data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +49 -12
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +79 -21
- data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/split.js +12 -2
- data/lib/frameworks/sproutcore/frameworks/desktop/resources/menu_item_view.css +8 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/resources/overlay-scroller.css +187 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +94 -30
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +163 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +97 -78
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +61 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +7 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +47 -22
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +66 -9
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +21 -11
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +12 -18
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/methods.js +17 -14
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +9 -6
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/collection_fast_path.js +54 -21
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +52 -20
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +94 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/keyboard.js +177 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +13 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +9 -9
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +18 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +104 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +48 -49
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/drag_and_drop.js +22 -18
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +17 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/link_view_test.js +136 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/contentIndexesInRect.js +77 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/drag_and_drop.js +53 -16
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/layoutForContentIndex.js +41 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +25 -25
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +102 -27
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/{rowHeightForContentIndex.js → rowSizeForContentIndex.js} +7 -6
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +70 -75
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +29 -30
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +57 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/menu_scroll_view/menu_scroll_view_test.js +206 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +15 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +15 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +16 -11
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +164 -12
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/scale.js +387 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/touch.js +549 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +214 -45
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +73 -22
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +88 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/methods.js +8 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/methods.js +16 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/ui.js +54 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/dividers.js +21 -2
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/static_content.js +31 -25
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +109 -29
- data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +10 -1
- data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +3 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +779 -603
- data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +106 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/views/link_view.js +406 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +437 -245
- data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +13 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +124 -62
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +176 -597
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroller_view.js +206 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +3 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +5 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +3 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +56 -158
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll_view.js +2560 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +458 -242
- data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +117 -54
- data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +18 -12
- data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +162 -34
- data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +30 -15
- data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +33 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +22 -2
- data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +47 -22
- data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +0 -6
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form_row.js +21 -21
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -3
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/mixins/select_view_menu.js +24 -10
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/ext/menu_resizing.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/bindings.js +7 -4
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/check_selected.js +7 -9
- data/lib/frameworks/sproutcore/frameworks/{desktop/tests/panes/select_button/methods.js → experimental/frameworks/select_view/tests/views/select/method.js} +54 -76
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/selected_item.js +35 -0
- data/lib/frameworks/sproutcore/frameworks/{desktop/tests/panes/select_button → experimental/frameworks/select_view/tests/views/select}/ui.js +107 -36
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +225 -66
- data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +39 -38
- data/lib/frameworks/sproutcore/frameworks/foundation/core.js +5 -18
- data/lib/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +12 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/inflections.js +84 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/french.lproj/inflections.js +41 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_mixin.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +3 -4
- data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +6 -2
- data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +408 -239
- data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +2 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/spanish.lproj/inflections.js +38 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +104 -76
- data/lib/frameworks/sproutcore/frameworks/foundation/system/string.js +20 -94
- data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +33 -22
- data/lib/frameworks/sproutcore/frameworks/foundation/system/undo_manager.js +475 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/auto_resize_test.js +163 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +41 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +2 -5
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/methods.js +268 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/undo_manager.js +231 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +16 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +27 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +24 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +135 -6
- data/lib/frameworks/sproutcore/frameworks/foundation/transitions/fade_transition.js +6 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/transitions/pop_transition.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/transitions/scale_transition.js +6 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/transitions/slide_transition.js +4 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/transitions/swap_dissolve_transition.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +21 -21
- data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +65 -15
- data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +193 -213
- data/lib/frameworks/sproutcore/frameworks/jquery/{jquery-1.8.3-patched.js → jquery-1.11.1.js} +7507 -6684
- data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +28 -11
- data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +26 -0
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +54 -25
- data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +0 -6
- data/lib/frameworks/sproutcore/frameworks/runtime/ext/number.js +36 -0
- data/lib/frameworks/sproutcore/frameworks/runtime/ext/window.js +25 -0
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +156 -66
- data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +150 -65
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +57 -11
- data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +68 -49
- data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +14 -6
- data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +23 -23
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/ext/number_test.js +44 -0
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +0 -10
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable.js +340 -285
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +104 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/observer_set.js +14 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +15 -2
- data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +21 -18
- data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +52 -19
- data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/pane.js +27 -24
- data/lib/frameworks/sproutcore/frameworks/template_view/controls/button.js +30 -0
- data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/bind.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/collection.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/view.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/template_view/tests/mixins/template_helpers/checkbox_support.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/handlebars.js +4 -2
- data/lib/frameworks/sproutcore/frameworks/template_view/views/bindable_span.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/template_view/views/template_collection.js +16 -14
- data/lib/frameworks/sproutcore/frameworks/testing/core.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +13 -0
- data/lib/frameworks/sproutcore/lib/index.rhtml +2 -2
- data/lib/frameworks/sproutcore/phantomjs/test_runner.js +28 -7
- data/lib/frameworks/sproutcore/scripts/run_sc_server_master.sh +1 -1
- data/lib/frameworks/sproutcore/themes/ace/resources/_variables.css +2 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +1 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +3 -4
- data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal.css +15 -15
- data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_overlay.css +74 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical.css +11 -13
- data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical_overlay.css +74 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob-active.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob-active@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/knob@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/{22px → jumbo}/slider.css +9 -4
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/track.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/jumbo/track@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob-active.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob-active@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/knob@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/slider.css +32 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/track.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/regular/track@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/slider.css +13 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob-active.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob-active@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/knob@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/slider.css +32 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/track.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/small/track@2x.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/split/split.css +2 -3
- data/lib/sproutcore/builders/chance_file.rb +3 -3
- data/lib/sproutcore/helpers/minifier.rb +1 -0
- data/vendor/chance/lib/chance/instance.rb +34 -34
- data/vendor/chance/lib/chance/instance/spriting.rb +21 -16
- metadata +81 -58
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/visibility.js +0 -17
- data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +0 -710
- data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +0 -267
- data/lib/frameworks/sproutcore/frameworks/desktop/resources/touch-scroller.css +0 -196
- data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +0 -224
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +0 -163
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +0 -177
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +0 -2053
- data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +0 -1024
- data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +0 -404
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +0 -28
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +0 -235
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +0 -363
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +0 -250
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/README.md +0 -47
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/models/record.js +0 -134
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +0 -92
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +0 -25
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +0 -33
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +0 -76
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +0 -25
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +0 -143
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +0 -256
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +0 -1164
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +0 -332
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +0 -236
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +0 -347
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +0 -15
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +0 -10
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +0 -804
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +0 -133
- data/lib/frameworks/sproutcore/frameworks/foundation/tasks/preload_bundle.js +0 -41
- data/lib/frameworks/sproutcore/themes/ace/resources/scroller/horizontal/horizontal_touch.css +0 -91
- data/lib/frameworks/sproutcore/themes/ace/resources/scroller/vertical/vertical_touch.css +0 -92
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/knob.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/knob_active.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/14px/slider.css +0 -27
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/knob.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/knob_active.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/16px/slider.css +0 -27
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/knob.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/knob_active.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/22px/track.png +0 -0
- data/lib/frameworks/sproutcore/themes/ace/resources/slider/ace/track.png +0 -0
@@ -35,7 +35,6 @@ SC.TextSelection = SC.Object.extend(SC.Copyable, SC.Freezable,
|
|
35
35
|
*/
|
36
36
|
start: -1,
|
37
37
|
|
38
|
-
|
39
38
|
/**
|
40
39
|
The number of characters appearing to the left of the end of the
|
41
40
|
selection.
|
@@ -47,6 +46,19 @@ SC.TextSelection = SC.Object.extend(SC.Copyable, SC.Freezable,
|
|
47
46
|
*/
|
48
47
|
end: -1,
|
49
48
|
|
49
|
+
/**
|
50
|
+
The direction of the selection. Currently only supported on Chrome,
|
51
|
+
Firefox, and Safari >= 6.
|
52
|
+
|
53
|
+
Possible values are
|
54
|
+
* 'none'
|
55
|
+
* 'forward'
|
56
|
+
* 'backward'
|
57
|
+
|
58
|
+
@type {String}
|
59
|
+
@default 'none'
|
60
|
+
*/
|
61
|
+
direction: 'none',
|
50
62
|
|
51
63
|
/**
|
52
64
|
The length of the selection. This is equivalent to (end - start) and
|
@@ -54,50 +66,49 @@ SC.TextSelection = SC.Object.extend(SC.Copyable, SC.Freezable,
|
|
54
66
|
|
55
67
|
@type Number
|
56
68
|
*/
|
57
|
-
length: function() {
|
58
|
-
var start = this.get('start')
|
59
|
-
var end = this.get('end')
|
60
|
-
if (
|
61
|
-
return -1
|
62
|
-
}
|
63
|
-
|
64
|
-
return end - start ;
|
69
|
+
length: function () {
|
70
|
+
var start = this.get('start');
|
71
|
+
var end = this.get('end');
|
72
|
+
if (start === -1 || end === -1) {
|
73
|
+
return -1;
|
74
|
+
} else {
|
75
|
+
return end - start;
|
65
76
|
}
|
66
77
|
}.property('start', 'end').cacheable(),
|
67
78
|
|
68
|
-
|
69
|
-
|
70
79
|
// ..........................................................
|
71
80
|
// INTERNAL SUPPORT
|
72
81
|
//
|
73
82
|
|
74
|
-
init: function() {
|
83
|
+
init: function () {
|
75
84
|
sc_super();
|
76
85
|
this.freeze();
|
77
86
|
},
|
78
87
|
|
79
|
-
|
80
|
-
copy: function() {
|
88
|
+
copy: function () {
|
81
89
|
return SC.TextSelection.create({
|
82
90
|
start: this.get('start'),
|
83
|
-
end: this.get('end')
|
91
|
+
end: this.get('end'),
|
92
|
+
direction: this.get('direction')
|
84
93
|
});
|
85
94
|
},
|
86
95
|
|
96
|
+
toString: function () {
|
97
|
+
var length = this.get('length'),
|
98
|
+
start = this.get('start'),
|
99
|
+
end = this.get('end'),
|
100
|
+
direction = this.get('direction');
|
87
101
|
|
88
|
-
toString: function() {
|
89
|
-
var length = this.get('length');
|
90
102
|
if (length && length > 0) {
|
91
103
|
if (length === 1) {
|
92
|
-
return "[%@ character selected: {%@, %@}]".fmt(length,
|
104
|
+
return "[%@ character selected: {%@, %@}; direction: %@]".fmt(length, start, end, direction);
|
93
105
|
}
|
94
106
|
else {
|
95
|
-
return "[%@ characters selected: {%@, %@}]".fmt(length,
|
107
|
+
return "[%@ characters selected: {%@, %@}; direction: %@]".fmt(length, start, end, direction);
|
96
108
|
}
|
97
109
|
}
|
98
110
|
else {
|
99
|
-
return "[no text selected; caret at %@]".fmt(
|
111
|
+
return "[no text selected; caret at %@]".fmt(start);
|
100
112
|
}
|
101
113
|
}
|
102
|
-
|
103
|
-
}) ;
|
114
|
+
});
|
@@ -0,0 +1,475 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore - JavaScript Application Framework
|
3
|
+
// Copyright: ©2006-2011 Strobe Inc. and contributors.
|
4
|
+
// Portions ©2008-2011 Apple Inc. All rights reserved.
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
|
+
// ==========================================================================
|
7
|
+
|
8
|
+
/**
|
9
|
+
@class
|
10
|
+
|
11
|
+
This is a simple undo manager. It manages groups of actions which return
|
12
|
+
something to an earlier state. It's your responsibility to make sure that
|
13
|
+
these functions successfully undo the action, and register an undo action
|
14
|
+
of their own (allowing redo).
|
15
|
+
|
16
|
+
## Using SC.UndoManager
|
17
|
+
|
18
|
+
You should create one SC.UndoManager instance for each thing you want to
|
19
|
+
allow undo on. For example, if a controller manages a single record, but
|
20
|
+
you have two fields that should each have their own undo stack, you should
|
21
|
+
create two separate managers.
|
22
|
+
|
23
|
+
Register undo functions via the `registerUndoAction`, which takes a target,
|
24
|
+
action, context and optional human-readable action name. Trigger actions by
|
25
|
+
calling the `undo` and `redo` methods. Actions will be called with `context`
|
26
|
+
as their only argument.
|
27
|
+
|
28
|
+
Optionally, you can group undo actions; groups of actions are triggered
|
29
|
+
together.
|
30
|
+
|
31
|
+
### Simple Example: A single value
|
32
|
+
|
33
|
+
This example attaches an undo manager to a controller and registers an undo
|
34
|
+
function each time the value of `value` changes. It also exposes methods to
|
35
|
+
trigger undos and redos, triggered via buttons in the included stub view class.
|
36
|
+
|
37
|
+
// Controller:
|
38
|
+
MyApp.myController = SC.ObjectController.create({
|
39
|
+
// Content, with `value`.
|
40
|
+
content: SC.Object.create({ value: 'Hello, World.' }),
|
41
|
+
|
42
|
+
// Undo manager.
|
43
|
+
valueUndoManager: SC.UndoManager.create(),
|
44
|
+
|
45
|
+
// Undo action.
|
46
|
+
_valueUndoAction(val) {
|
47
|
+
// This call will trigger the controller's `value` observer, triggering the registration
|
48
|
+
// of another undo; the UndoManager will automatically and correctly interpret this as
|
49
|
+
// the registration of a redo method.
|
50
|
+
this.set('value', val);
|
51
|
+
},
|
52
|
+
|
53
|
+
// Value observer; tracks `value` and registers undos.
|
54
|
+
valueDidChange: function() {
|
55
|
+
// Get the values.
|
56
|
+
var value = this.get('value'),
|
57
|
+
previousValue = this._previousValue,
|
58
|
+
that = this;
|
59
|
+
|
60
|
+
// Update previous value.
|
61
|
+
this._previousValue = value;
|
62
|
+
|
63
|
+
// GATEKEEP: If the current value is the same as the previous value, there's nothing to do.
|
64
|
+
if (previousValue === value) return;
|
65
|
+
|
66
|
+
// GATEKEEP: If there is no previous value, it's probably our initial spinup. We don't want
|
67
|
+
// to register an undo-back-to-undefined method, so we should return. (Your situation may be
|
68
|
+
// different.)
|
69
|
+
if (SC.none(previousValue)) return;
|
70
|
+
|
71
|
+
// Otherwise, register an undo function. (previousValue is accessed via the closure.)
|
72
|
+
this.undoManager.registerUndoAction(this, this._valueUndoAction, previousValue);
|
73
|
+
}.observes('value')
|
74
|
+
});
|
75
|
+
|
76
|
+
// Stub view:
|
77
|
+
MyApp.UndoableValueView = SC.View.extend({
|
78
|
+
childViews: ['labelView', 'undoButtonView', 'redoButtonView'],
|
79
|
+
labelView: SC.LabelView.extend({
|
80
|
+
layout: { height: 24 },
|
81
|
+
isEdiable: YES,
|
82
|
+
valueBinding: 'MyApp.myController.value'
|
83
|
+
}),
|
84
|
+
undoButtonView: SC.ButtonView.extend({
|
85
|
+
layout: { height: 24, width: 60, bottom: 0 },
|
86
|
+
title: 'Undo',
|
87
|
+
isEnabledBinding: SC.Binding.oneWay('MyApp.myController.valueUndoManager.canUndo'),
|
88
|
+
target: 'MyApp.myController.valueUndoManager',
|
89
|
+
action: 'undo'
|
90
|
+
}),
|
91
|
+
redoButtonView: SC.ButtonView.extend({
|
92
|
+
layout: { height: 24, width: 60, bottom: 0, right: 0 },
|
93
|
+
title: 'Redo',
|
94
|
+
isEnabledBinding: SC.Binding.oneWay('MyApp.myController.valueUndoManager.canRedo'),
|
95
|
+
target: 'MyApp.myController.valueUndoManager',
|
96
|
+
action: 'redo'
|
97
|
+
})
|
98
|
+
});
|
99
|
+
|
100
|
+
### Advanced: Grouping undos
|
101
|
+
|
102
|
+
Undo events registered by `registerUndoAction` will undo or redo one at a time. If you wish,
|
103
|
+
you can group undo events into groups (for example, if you wish to group all undos which happen
|
104
|
+
within a short duration of each other). Groups are fired all at once when `undo` or `redo` is
|
105
|
+
called.
|
106
|
+
|
107
|
+
To start a new undo group, call `beginUndoGroup`; to register undo functions to the currently-
|
108
|
+
open group, call `registerGroupedUndoAction`; finally, to mark the end of a grouped set of undo
|
109
|
+
functions, call `endUndoGroup`. In most cases, you will not need to call `beginUndoGroup` and
|
110
|
+
`endUndoGroup`: if you call `registerUndoAction`, any open group will be closed, and a new group
|
111
|
+
will be created and left open; calling `registerGroupedUndoAction` will simply add to the
|
112
|
+
currently-open group, creating a new one if necessary. This means that in practice, you can call
|
113
|
+
`registerUndoAction` to close previous groups and begin a new one, and `registerGroupedUndoAction`
|
114
|
+
to add to an existing group.
|
115
|
+
|
116
|
+
If `undo` is called while an undo group is open, UndoManager will simply close the group for
|
117
|
+
you before executing it. This allows you to safely leave groups open pending possible additional
|
118
|
+
undo actions.
|
119
|
+
|
120
|
+
@extends SC.Object
|
121
|
+
*/
|
122
|
+
SC.UndoManager = SC.Object.extend(
|
123
|
+
/** @scope SC.UndoManager.prototype */ {
|
124
|
+
|
125
|
+
/**
|
126
|
+
If name arguments are passed into `registerUndoAction` or related methods, then this property
|
127
|
+
will expose the last undo action's name. You can use this to show the user what type of action
|
128
|
+
will be undone (for example "typing" or "delete").
|
129
|
+
|
130
|
+
@field
|
131
|
+
@readonly
|
132
|
+
@type String
|
133
|
+
@default null
|
134
|
+
*/
|
135
|
+
undoActionName: function () {
|
136
|
+
return this.undoStack ? this.undoStack.name : null;
|
137
|
+
}.property('undoStack').cacheable(),
|
138
|
+
|
139
|
+
/**
|
140
|
+
Exposes the timestamp of the most recent undo action.
|
141
|
+
|
142
|
+
@field
|
143
|
+
@readonly
|
144
|
+
@type SC.DateTime
|
145
|
+
@default null
|
146
|
+
*/
|
147
|
+
undoActionTimestamp: function() {
|
148
|
+
return this.undoStack ? this.undoStack.timeStamp : null;
|
149
|
+
}.property('undoStack').cacheable(),
|
150
|
+
|
151
|
+
/**
|
152
|
+
If name arguments are passed into `registerUndoAction` or related methods, then this property
|
153
|
+
will expose the last redo action's name. You can use this to show the user what type of
|
154
|
+
action will be redone (for example "Redo typing" or "Redo delete").
|
155
|
+
|
156
|
+
@field
|
157
|
+
@readonly
|
158
|
+
@type String
|
159
|
+
@default null
|
160
|
+
*/
|
161
|
+
redoActionName: function () {
|
162
|
+
return this.redoStack ? this.redoStack.name : null;
|
163
|
+
}.property('redoStack').cacheable(),
|
164
|
+
|
165
|
+
/**
|
166
|
+
Exposes the timestamp of the most recent redo action.
|
167
|
+
|
168
|
+
@field
|
169
|
+
@readonly
|
170
|
+
@type SC.DateTime
|
171
|
+
@default null
|
172
|
+
*/
|
173
|
+
redoActionTimestamp: function() {
|
174
|
+
return this.redoStack ? this.redoStack.timeStamp : null;
|
175
|
+
}.property('redoStack').cacheable(),
|
176
|
+
|
177
|
+
/**
|
178
|
+
True if there is an undo action on the stack. Use to validate your menu item or enable
|
179
|
+
your button.
|
180
|
+
|
181
|
+
@field
|
182
|
+
@readonly
|
183
|
+
@type Boolean
|
184
|
+
@default NO
|
185
|
+
*/
|
186
|
+
canUndo: function () {
|
187
|
+
return !SC.none(this.undoStack);
|
188
|
+
}.property('undoStack').cacheable(),
|
189
|
+
|
190
|
+
/**
|
191
|
+
True if there is an redo action on the stack. Use to validate your menu item or enable
|
192
|
+
your button.
|
193
|
+
|
194
|
+
@field
|
195
|
+
@readonly
|
196
|
+
@type Boolean
|
197
|
+
@default NO
|
198
|
+
*/
|
199
|
+
canRedo: function () {
|
200
|
+
return !SC.none(this.redoStack);
|
201
|
+
}.property('redoStack').cacheable(),
|
202
|
+
|
203
|
+
/**
|
204
|
+
Tries to undo the last action. Fails if an undo group is currently open.
|
205
|
+
|
206
|
+
@returns {Boolean} YES if succeeded, NO otherwise.
|
207
|
+
*/
|
208
|
+
undo: function () {
|
209
|
+
this._undoOrRedo('undoStack','isUndoing');
|
210
|
+
},
|
211
|
+
|
212
|
+
/**
|
213
|
+
Tries to redo the last action. Fails if a redo group is currently open.
|
214
|
+
|
215
|
+
@returns {Boolean} YES if succeeded, NO otherwise.
|
216
|
+
*/
|
217
|
+
redo: function () {
|
218
|
+
this._undoOrRedo('redoStack','isRedoing');
|
219
|
+
},
|
220
|
+
|
221
|
+
/**
|
222
|
+
Resets the undo and redo stacks.
|
223
|
+
*/
|
224
|
+
reset: function () {
|
225
|
+
this._activeGroup = null;
|
226
|
+
this.set('undoStack', null);
|
227
|
+
this.set('redoStack', null);
|
228
|
+
},
|
229
|
+
|
230
|
+
/**
|
231
|
+
The maximum number of undo groups the receiver holds.
|
232
|
+
The undo stack is unlimited by default.
|
233
|
+
|
234
|
+
@type Number
|
235
|
+
@default 0
|
236
|
+
*/
|
237
|
+
maxStackLength: 0,
|
238
|
+
|
239
|
+
/**
|
240
|
+
@type Boolean
|
241
|
+
@default NO
|
242
|
+
*/
|
243
|
+
isUndoing: NO,
|
244
|
+
|
245
|
+
/**
|
246
|
+
@type Boolean
|
247
|
+
@default NO
|
248
|
+
*/
|
249
|
+
isRedoing: NO,
|
250
|
+
|
251
|
+
// --------------------------------
|
252
|
+
// UNDO ACTION REGISTRATION
|
253
|
+
//
|
254
|
+
|
255
|
+
/**
|
256
|
+
Registers an undo action. If called while an undo is in progress (i.e. from your
|
257
|
+
undo method, or from observers which it triggers), registers a redo action instead.
|
258
|
+
|
259
|
+
@param {String|Object} target The action's target (`this`).
|
260
|
+
@param {String|Function} action The method on `target` to be called.
|
261
|
+
@param {Object} context The context passed to the action when called.
|
262
|
+
@param {String} name An optional human-readable name for the undo action.
|
263
|
+
*/
|
264
|
+
registerUndoAction: function(target, action, context, name) {
|
265
|
+
// Calls to registerUndoAction close any open undo groups, open a new one and register
|
266
|
+
// to it. This means that a series of calls to registerUndo will simply open and close
|
267
|
+
// a series of single-function groups, as intended.
|
268
|
+
|
269
|
+
if (!this.isUndoing && !this.isRedoing) {
|
270
|
+
if (this._activeGroup) {
|
271
|
+
this.endUndoGroup();
|
272
|
+
}
|
273
|
+
this.beginUndoGroup(name);
|
274
|
+
}
|
275
|
+
|
276
|
+
this.registerGroupedUndoAction(target, action, context);
|
277
|
+
},
|
278
|
+
|
279
|
+
/**
|
280
|
+
Registers an undo action to the current group. If no group is open, opens a new
|
281
|
+
one.
|
282
|
+
|
283
|
+
@param {String|Object} target The action's target (`this`).
|
284
|
+
@param {String|Function} action The method on `target` to be called.
|
285
|
+
@param {Object} context The context passed to the action when called.
|
286
|
+
@param {String} name An optional human-readable name for the undo action. Sets or
|
287
|
+
changes the current group's name.
|
288
|
+
*/
|
289
|
+
registerGroupedUndoAction: function(target, action, context, name) {
|
290
|
+
// If we don't have an active group, route the call through registerUndoAction, which will
|
291
|
+
// handle creating a new group for us before returning here. (Slight hack.)
|
292
|
+
if (!this._activeGroup) {
|
293
|
+
this.registerUndoAction(target, action, context, name);
|
294
|
+
}
|
295
|
+
// Otherwise, register the action.
|
296
|
+
else {
|
297
|
+
if (name) this._activeGroup.name = name;
|
298
|
+
this._activeGroup.targets.push(target);
|
299
|
+
this._activeGroup.actions.push(action);
|
300
|
+
this._activeGroup.contexts.push(context);
|
301
|
+
this._activeGroup.timeStamp = SC.DateTime.create();
|
302
|
+
|
303
|
+
// If we're not mid-undo or -redo, then we're registering a new undo, and should
|
304
|
+
// clear out any redoStack.
|
305
|
+
if (!this.isUndoing && !this.isRedoing) {
|
306
|
+
this.set('redoStack', null);
|
307
|
+
}
|
308
|
+
}
|
309
|
+
},
|
310
|
+
|
311
|
+
/**
|
312
|
+
Begins a new undo group.
|
313
|
+
|
314
|
+
Whenever you start an action that you expect to need to bundle under a single
|
315
|
+
undo action in the menu, you should begin an undo group. This way any
|
316
|
+
undo actions registered by other parts of the application will be
|
317
|
+
automatically bundled into this one action.
|
318
|
+
|
319
|
+
When you are finished performing the action, balance this with a call to
|
320
|
+
`endUndoGroup()`. (You can call `undo` or `redo` with an open group; the group
|
321
|
+
will simply be closed and processed as normal.)
|
322
|
+
|
323
|
+
@param {String} name
|
324
|
+
*/
|
325
|
+
beginUndoGroup: function (name) {
|
326
|
+
if (this._activeGroup) {
|
327
|
+
//@if(debug)
|
328
|
+
SC.warn("SC.UndoManager#beginUndoGroup() called while inside group.");
|
329
|
+
//@endif
|
330
|
+
return;
|
331
|
+
}
|
332
|
+
|
333
|
+
var stack = this.isUndoing ? 'redoStack' : 'undoStack';
|
334
|
+
|
335
|
+
this._activeGroup = {
|
336
|
+
// The action's name (see undoActionName). Optional.
|
337
|
+
name: name,
|
338
|
+
// Ordered lists of targets, actions and contexts. (Nth items in each list go together.)
|
339
|
+
targets: [],
|
340
|
+
actions: [],
|
341
|
+
contexts: [],
|
342
|
+
// The previous undo action. When this group is triggered, prev will become the new stack.
|
343
|
+
prev: this.get(stack),
|
344
|
+
// When the action was registered. Useful for grouping undo actions by time.
|
345
|
+
timeStamp: SC.DateTime.create()
|
346
|
+
};
|
347
|
+
|
348
|
+
this.set(stack, this._activeGroup);
|
349
|
+
},
|
350
|
+
|
351
|
+
/**
|
352
|
+
Ends a group of undo functions. All functions in an undo group will be undone or redone
|
353
|
+
together when `undo` or `redo` is called.
|
354
|
+
|
355
|
+
@see beginUndoGroup()
|
356
|
+
*/
|
357
|
+
endUndoGroup: function () {
|
358
|
+
var maxStackLength = this.get('maxStackLength'),
|
359
|
+
stackName = this.isUndoing ? 'redoStack' : 'undoStack';
|
360
|
+
|
361
|
+
if (!this._activeGroup) {
|
362
|
+
//@if(debug)
|
363
|
+
SC.warn("SC.UndoManager#endUndoGroup() called outside group.");
|
364
|
+
//@endif
|
365
|
+
return;
|
366
|
+
}
|
367
|
+
|
368
|
+
this._activeGroup = null;
|
369
|
+
this.notifyPropertyChange(stackName);
|
370
|
+
|
371
|
+
// If we have a maxStackLength, trace back through stack.prev that many times and
|
372
|
+
// null out anything older.
|
373
|
+
if (maxStackLength > 0) {
|
374
|
+
var stack = this[stackName],
|
375
|
+
i = 1;
|
376
|
+
while(stack = stack.prev) {
|
377
|
+
i++;
|
378
|
+
if (i >= maxStackLength) {
|
379
|
+
stack.prev = null;
|
380
|
+
}
|
381
|
+
}
|
382
|
+
}
|
383
|
+
},
|
384
|
+
|
385
|
+
/**
|
386
|
+
Change the name of the current undo group.
|
387
|
+
|
388
|
+
@param {String} name
|
389
|
+
*/
|
390
|
+
setActionName: function (name) {
|
391
|
+
if (!this._activeGroup) {
|
392
|
+
//@if(debug)
|
393
|
+
SC.warn("SC.UndoManager#setActionName() called without an active undo group.");
|
394
|
+
//@endif
|
395
|
+
return;
|
396
|
+
}
|
397
|
+
this._activeGroup.name = name;
|
398
|
+
},
|
399
|
+
|
400
|
+
// --------------------------------
|
401
|
+
// PRIVATE
|
402
|
+
//
|
403
|
+
|
404
|
+
/** @private */
|
405
|
+
_activeGroup: null,
|
406
|
+
|
407
|
+
/** @private */
|
408
|
+
undoStack: null,
|
409
|
+
|
410
|
+
/** @private */
|
411
|
+
redoStack: null,
|
412
|
+
|
413
|
+
/** @private */
|
414
|
+
_undoOrRedo: function (stack, state) {
|
415
|
+
// Close out any open undo groups.
|
416
|
+
if (this._activeGroup) this.endUndoGroup();
|
417
|
+
|
418
|
+
// Flag the state.
|
419
|
+
this.set(state, true);
|
420
|
+
|
421
|
+
// Run the group of actions!
|
422
|
+
var group = this.get(stack);
|
423
|
+
if (group) {
|
424
|
+
// Roll back the stack to the previous item.
|
425
|
+
this.set(stack, group.prev);
|
426
|
+
// Open a new group of the opposite persuasion with the same name. This makes sure a redo
|
427
|
+
// action will have the same name as its corresponding undo action.
|
428
|
+
this.beginUndoGroup(group.name);
|
429
|
+
|
430
|
+
// Run the actions backwards.
|
431
|
+
var len = group.actions.length,
|
432
|
+
target, action, context, i;
|
433
|
+
for (i = len - 1; i >= 0; i--) {
|
434
|
+
target = group.targets[i];
|
435
|
+
action = group.actions[i];
|
436
|
+
context = group.contexts[i];
|
437
|
+
|
438
|
+
// Normalize (for convenience and backward-compatibility).
|
439
|
+
// If target is a function, it's the action.
|
440
|
+
if (SC.typeOf(target) === SC.T_FUNCTION) {
|
441
|
+
action = target;
|
442
|
+
target = null;
|
443
|
+
}
|
444
|
+
// If target is a string, see if it points to an object.
|
445
|
+
if (SC.typeOf(target) === SC.T_STRING) target = SC.objectForPropertyPath(target);
|
446
|
+
// If action is a string, see if it's the name of a method on target.
|
447
|
+
if (target && SC.typeOf(action) === SC.T_STRING && SC.typeOf(target[action]) === SC.T_FUNCTION) action = target[action];
|
448
|
+
|
449
|
+
// Call!
|
450
|
+
if (SC.typeOf(action) === SC.T_FUNCTION) action.call(target, context);
|
451
|
+
}
|
452
|
+
|
453
|
+
// Close the opposite-persuasion group opened above.
|
454
|
+
this.endUndoGroup();
|
455
|
+
}
|
456
|
+
this.set(state, false);
|
457
|
+
},
|
458
|
+
|
459
|
+
/** @private */
|
460
|
+
destroy: function() {
|
461
|
+
this._activeGroup = null;
|
462
|
+
this.set('undoStack', null);
|
463
|
+
this.set('redoStack', null);
|
464
|
+
return sc_super();
|
465
|
+
},
|
466
|
+
|
467
|
+
/** @private Deprecated as of 1.11. Use registerUndoAction instead. */
|
468
|
+
registerUndo: function (func, name) {
|
469
|
+
//@if(debug)
|
470
|
+
SC.warn('SC.UndoManager#registerUndo is deprecated and will be removed in a future version. Use registerUndoAction.');
|
471
|
+
//@endif
|
472
|
+
this.registerUndoAction(null, func, null, name);
|
473
|
+
}
|
474
|
+
|
475
|
+
});
|