opal 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +10 -1
- data/.gitmodules +0 -0
- data/Opalfile +371 -0
- data/README.md +45 -0
- data/Rakefile +237 -34
- data/VERSION +1 -1
- data/bin/opal +13 -0
- data/demos/apps/browser_demo/index.html +11 -0
- data/demos/apps/browser_demo/lib/browser_demo.rb +31 -0
- data/demos/apps/simple_opal/Opalfile +13 -0
- data/demos/apps/simple_opal/index.html +11 -0
- data/demos/apps/simple_opal/lib/app_controller.rb +62 -0
- data/demos/apps/simple_opal/lib/main_window.rb +146 -0
- data/demos/browser/request/index.html +52 -0
- data/demos/browser/request/request.rb +48 -0
- data/gen/browser/__PROJECT_NAME__/index.html +10 -0
- data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +1 -0
- data/lib/opal.rb +48 -3
- data/lib/opal/builders/base.rb +50 -0
- data/lib/opal/builders/css.rb +46 -0
- data/lib/opal/builders/javascript.rb +44 -0
- data/lib/opal/builders/opal.rb +79 -0
- data/lib/opal/builders/ruby.rb +50 -0
- data/lib/opal/builders/ruby/generate.rb +1851 -0
- data/lib/opal/builders/ruby/nodes.rb +210 -0
- data/lib/opal/builders/ruby/ruby.rb +916 -0
- data/lib/opal/builders/ruby/ruby_parser.rb +6008 -0
- data/lib/opal/builders/ruby/ruby_parser.rb.y +1451 -0
- data/lib/opal/models/build_item.rb +104 -0
- data/lib/opal/models/hash_struct.rb +40 -0
- data/lib/opal/models/project.rb +215 -0
- data/lib/opal/models/struct_accessors.rb +58 -0
- data/lib/opal/models/target.rb +176 -0
- data/lib/opal/opal/env/console.rb +66 -0
- data/lib/opal/opal/env/fs.rb +98 -0
- data/lib/opal/opal/env/object.rb +48 -0
- data/lib/opal/opal/environment.rb +139 -0
- data/lib/opal/opal/gen.rb +62 -0
- data/lib/opal/opal/opal.rb +68 -0
- data/lib/opal/opal/repl.rb +38 -0
- data/lib/opal/opalfile/dsl.rb +62 -0
- data/lib/opal/opalfile/opalfile.rb +133 -0
- data/lib/opal/opalfile/task.rb +96 -0
- data/lib/opal/opalfile/task_manager.rb +63 -0
- data/lib/opal/opalfile/task_scope.rb +52 -0
- data/lib/opal/rack/app_server.rb +119 -0
- data/opals/aristo/README.md +16 -0
- data/opals/browser/Opalfile +11 -0
- data/opals/browser/README.md +146 -0
- data/opals/browser/SIZZLE_LICESNSE.txt +148 -0
- data/opals/browser/lib/browser.rb +118 -0
- data/opals/browser/lib/browser/builder.rb +41 -0
- data/opals/browser/lib/browser/canvas_context.rb +115 -0
- data/opals/browser/lib/browser/dimensions.rb +50 -0
- data/opals/browser/lib/browser/document.rb +146 -0
- data/opals/browser/lib/browser/element.rb +487 -0
- data/opals/browser/lib/browser/element/attributes.rb +88 -0
- data/opals/browser/lib/browser/element/css.rb +290 -0
- data/opals/browser/lib/browser/element/form.rb +146 -0
- data/opals/browser/lib/browser/event/dom_events.rb +81 -0
- data/opals/browser/lib/browser/event/event.rb +177 -0
- data/opals/browser/lib/browser/event/trigger_events.rb +53 -0
- data/opals/browser/lib/browser/geometry.rb +97 -0
- data/opals/browser/lib/browser/json.rb +32 -0
- data/opals/browser/lib/browser/json_parse.js +321 -0
- data/opals/browser/lib/browser/request/request.rb +201 -0
- data/opals/browser/lib/browser/sizzle.js +1068 -0
- data/opals/browser/lib/browser/string.rb +42 -0
- data/opals/browser/lib/browser/touch.rb +37 -0
- data/{runtime/yaml.js → opals/browser/lib/browser/vml_context.js} +8 -8
- data/opals/browser/lib/browser/window.rb +36 -0
- data/opals/browser/spec/browser/browser_detection_spec.rb +7 -0
- data/opals/browser/spec/document/aref_spec.rb +110 -0
- data/opals/browser/spec/document/ready_spec.rb +16 -0
- data/opals/browser/spec/element/body_spec.rb +11 -0
- data/opals/browser/spec/element/clear_spec.rb +26 -0
- data/opals/browser/spec/element/empty_spec.rb +29 -0
- data/opals/browser/spec/element/has_class_spec.rb +40 -0
- data/opals/browser/spec/element/hidden_spec.rb +23 -0
- data/opals/browser/spec/element/hide_spec.rb +31 -0
- data/opals/browser/spec/element/remove_spec.rb +25 -0
- data/opals/browser/spec/element/show_spec.rb +31 -0
- data/opals/browser/spec/element/style_spec.rb +69 -0
- data/opals/browser/spec/element/toggle_spec.rb +31 -0
- data/opals/browser/spec/element/visible_spec.rb +23 -0
- data/opals/browser/spec/spec_helper.rb +1 -0
- data/opals/cherry_kit/Opalfile +6 -0
- data/opals/cherry_kit/bin/cherry_kit.rb +11 -0
- data/opals/cherry_kit/lib/cherry_kit.rb +29 -0
- data/opals/foundation/Opalfile +11 -0
- data/opals/foundation/bin/foundation.rb +12 -0
- data/opals/foundation/lib/foundation.rb +32 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/outline_view.rb +57 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/table_column.rb +59 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/table_header_view.rb +34 -0
- data/opals/foundation/lib/foundation/__table_view_desktop/table_view.rb +304 -0
- data/opals/foundation/lib/foundation/controllers/array_controller.rb +54 -0
- data/opals/foundation/lib/foundation/controllers/controller.rb +74 -0
- data/opals/foundation/lib/foundation/controllers/controller_selection_proxy.rb +67 -0
- data/opals/foundation/lib/foundation/controllers/object_controller.rb +145 -0
- data/opals/foundation/lib/foundation/controllers/view.rb +40 -0
- data/opals/foundation/lib/foundation/core/application.rb +476 -0
- data/opals/foundation/lib/foundation/core/attributes.rb +146 -0
- data/opals/foundation/lib/foundation/core/bindings.rb +125 -0
- data/opals/foundation/lib/foundation/core/builder.rb +101 -0
- data/opals/foundation/lib/foundation/core/event.rb +112 -0
- data/opals/foundation/lib/foundation/core/index_path.rb +49 -0
- data/opals/foundation/lib/foundation/core/index_set.rb +97 -0
- data/opals/foundation/lib/foundation/core/notification.rb +113 -0
- data/opals/foundation/lib/foundation/core/observable.rb +275 -0
- data/opals/foundation/lib/foundation/core/observable_array.rb +30 -0
- data/opals/foundation/lib/foundation/core/responder.rb +85 -0
- data/opals/foundation/lib/foundation/core/run_loop.rb +89 -0
- data/opals/foundation/lib/foundation/core/touch.rb +95 -0
- data/opals/foundation/lib/foundation/gestures/gesture_recognizer.rb +35 -0
- data/opals/foundation/lib/foundation/rendering/render_context.rb +100 -0
- data/opals/foundation/lib/foundation/rendering/renderer.rb +137 -0
- data/opals/foundation/lib/foundation/rendering/root_theme.rb +77 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/button.rb +62 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/control.rb +72 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/label.rb +54 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/scroller.rb +58 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/slider.rb +72 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/table_view.rb +97 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/text_field.rb +55 -0
- data/opals/foundation/lib/foundation/rendering/root_theme/view.rb +81 -0
- data/opals/foundation/lib/foundation/rendering/theme.rb +38 -0
- data/opals/foundation/lib/foundation/table_view/cell.rb +39 -0
- data/opals/foundation/lib/foundation/table_view/table.rb +171 -0
- data/opals/foundation/lib/foundation/views/button.rb +63 -0
- data/opals/foundation/lib/foundation/views/checkbox.rb +28 -0
- data/opals/foundation/lib/foundation/views/clip.rb +47 -0
- data/opals/foundation/lib/foundation/views/control.rb +199 -0
- data/opals/foundation/lib/foundation/views/label.rb +54 -0
- data/opals/foundation/lib/foundation/views/scroll.rb +294 -0
- data/opals/foundation/lib/foundation/views/scroll_view_desktop.rb +152 -0
- data/opals/foundation/lib/foundation/views/scroller.rb +54 -0
- data/opals/foundation/lib/foundation/views/slider.rb +93 -0
- data/opals/foundation/lib/foundation/views/text_field.rb +83 -0
- data/opals/foundation/lib/foundation/views/view.rb +426 -0
- data/opals/foundation/lib/foundation/windows/window.rb +191 -0
- data/opals/foundation/resources/button/button.css +23 -0
- data/{runtime/init.js → opals/foundation/resources/foundation.css} +27 -33
- data/opals/foundation/resources/scroll/scroll.css +22 -0
- data/opals/foundation/resources/scroll_view/scroll_view.css +3 -0
- data/opals/foundation/resources/scroll_view/scroller.css +3 -0
- data/opals/foundation/resources/slider/regular/slider.css +3 -0
- data/opals/foundation/resources/slider/slider.css +27 -0
- data/opals/foundation/resources/table_view/outline_view.css +3 -0
- data/opals/foundation/resources/table_view/table_view.css +15 -0
- data/opals/foundation/resources/text_field/text_field.css +71 -0
- data/opals/foundation/spec/spec_helper.rb +1 -0
- data/opals/foundation/spec/system/attributes/get_attribute_spec.rb +69 -0
- data/opals/foundation/spec/system/attributes/get_path_spec.rb +44 -0
- data/opals/foundation/spec/system/attributes/set_path_spec.rb +24 -0
- data/opals/foundation/spec/system/attributes/set_spec.rb +58 -0
- data/opals/foundation/spec/system/bindings/bindings.rb +85 -0
- data/opals/foundation/spec/system/key_value_binding/bind_spec.rb +43 -0
- data/opals/foundation/spec/system/observable/dependant_keys_spec.rb +74 -0
- data/opals/foundation/spec/system/observable/observe_spec.rb +292 -0
- data/opals/foundation/spec/system/observable/remove_observer_spec.rb +60 -0
- data/opals/opal/Opalfile +14 -0
- data/opals/opal/spec/core/array/append_spec.rb +30 -0
- data/opals/opal/spec/core/array/assoc_spec.rb +29 -0
- data/opals/opal/spec/core/array/at_spec.rb +37 -0
- data/opals/opal/spec/core/array/clear_spec.rb +22 -0
- data/opals/opal/spec/core/array/collect_bang_spec.rb +27 -0
- data/opals/opal/spec/core/array/collect_spec.rb +27 -0
- data/opals/opal/spec/core/array/compact_spec.rb +15 -0
- data/opals/opal/spec/core/array/concat_spec.rb +15 -0
- data/opals/opal/spec/core/array/constructor_spec.rb +14 -0
- data/opals/opal/spec/core/array/each_spec.rb +9 -0
- data/opals/opal/spec/core/array/element_reference_spec.rb +4 -0
- data/opals/opal/spec/core/array/first_spec.rb +35 -0
- data/opals/opal/spec/core/array/include_spec.rb +9 -0
- data/opals/opal/spec/core/array/map_spec.rb +31 -0
- data/opals/opal/spec/core/builtin_constants/builtin_constants_spec.rb +7 -0
- data/opals/opal/spec/core/false/and_spec.rb +10 -0
- data/opals/opal/spec/core/false/inspect_spec.rb +6 -0
- data/opals/opal/spec/core/false/or_spec.rb +10 -0
- data/opals/opal/spec/core/false/to_s_spec.rb +6 -0
- data/opals/opal/spec/core/false/xor_spec.rb +10 -0
- data/opals/opal/spec/core/file/join_spec.rb +19 -0
- data/opals/opal/spec/core/kernel/instance_eval_spec.rb +0 -0
- data/opals/opal/spec/core/kernel/loop_spec.rb +24 -0
- data/opals/opal/spec/core/kernel/raise_spec.rb +0 -0
- data/opals/opal/spec/core/module/attr_accessor_spec.rb +28 -0
- data/opals/opal/spec/core/number/lt_spec.rb +12 -0
- data/opals/opal/spec/core/true/and_spec.rb +10 -0
- data/opals/opal/spec/core/true/inspect_spec.rb +6 -0
- data/opals/opal/spec/core/true/or_spec.rb +10 -0
- data/opals/opal/spec/core/true/to_s_spec.rb +6 -0
- data/opals/opal/spec/core/true/xor_spec.rb +10 -0
- data/opals/opal/spec/fixtures/super.rb +70 -0
- data/opals/opal/spec/language/____temp_remove_this.rb +12 -0
- data/opals/opal/spec/language/and_spec.rb +62 -0
- data/opals/opal/spec/language/array_spec.rb +52 -0
- data/opals/opal/spec/language/block_spec.rb +18 -0
- data/opals/opal/spec/language/break_spec.rb +36 -0
- data/opals/opal/spec/language/case_spec.rb +103 -0
- data/opals/opal/spec/language/def_spec.rb +11 -0
- data/opals/opal/spec/language/eigenclass_spec.rb +60 -0
- data/opals/opal/spec/language/hash_spec.rb +29 -0
- data/opals/opal/spec/language/if_spec.rb +54 -0
- data/opals/opal/spec/language/loop_spec.rb +11 -0
- data/opals/opal/spec/language/metaclass_spec.rb +21 -0
- data/opals/opal/spec/language/method_spec.rb +64 -0
- data/opals/opal/spec/language/next_spec.rb +25 -0
- data/opals/opal/spec/language/or_spec.rb +34 -0
- data/opals/opal/spec/language/redo_spec.rb +24 -0
- data/opals/opal/spec/language/rescue_spec.rb +20 -0
- data/opals/opal/spec/language/return_spec.rb +47 -0
- data/opals/opal/spec/language/string_spec.rb +25 -0
- data/opals/opal/spec/language/super_spec.rb +26 -0
- data/opals/opal/spec/language/until_spec.rb +157 -0
- data/opals/opal/spec/language/while_spec.rb +163 -0
- data/opals/opal/spec/spec_helper.rb +5 -0
- data/opals/runtime/Opalfile +68 -0
- data/opals/runtime/README.md +12 -0
- data/opals/runtime/docs/debugging.md +51 -0
- data/opals/runtime/lib/array.rb +1516 -0
- data/opals/runtime/lib/basic_object.rb +49 -0
- data/opals/runtime/lib/class.rb +54 -0
- data/opals/runtime/lib/dir.rb +36 -0
- data/opals/runtime/lib/error.rb +49 -0
- data/opals/runtime/lib/false_class.rb +52 -0
- data/opals/runtime/lib/file.rb +79 -0
- data/opals/runtime/lib/hash.rb +791 -0
- data/opals/runtime/lib/io.rb +39 -0
- data/opals/runtime/lib/kernel.rb +288 -0
- data/opals/runtime/lib/match_data.rb +36 -0
- data/opals/runtime/lib/module.rb +109 -0
- data/opals/runtime/lib/nil_class.rb +69 -0
- data/opals/runtime/lib/number.rb +398 -0
- data/opals/runtime/lib/proc.rb +77 -0
- data/opals/runtime/lib/range.rb +63 -0
- data/opals/runtime/lib/regexp.rb +111 -0
- data/opals/runtime/lib/ruby.rb +30 -0
- data/opals/runtime/lib/string.rb +328 -0
- data/opals/runtime/lib/symbol.rb +40 -0
- data/opals/runtime/lib/top_self.rb +33 -0
- data/opals/runtime/lib/true_class.rb +45 -0
- data/opals/runtime/runtime/browser.js +287 -0
- data/opals/runtime/runtime/debug.js +182 -0
- data/opals/runtime/runtime/opal.js +1010 -0
- data/opals/runtime/runtime/post_opal.js +1 -0
- data/opals/runtime/runtime/pre_opal.js +2 -0
- data/opals/runtime/runtime/server_side.js +50 -0
- data/opals/spec/LICENSE.txt +26 -0
- data/opals/spec/Opalfile +5 -0
- data/opals/spec/bin/spec.rb +43 -0
- data/opals/spec/lib/spec.rb +33 -0
- data/opals/spec/lib/spec/dsl.rb +41 -0
- data/opals/spec/lib/spec/example.rb +35 -0
- data/opals/spec/lib/spec/example/before_and_after_hooks.rb +81 -0
- data/opals/spec/lib/spec/example/errors.rb +42 -0
- data/opals/spec/lib/spec/example/example_group.rb +37 -0
- data/opals/spec/lib/spec/example/example_group_factory.rb +43 -0
- data/opals/spec/lib/spec/example/example_group_hierarchy.rb +45 -0
- data/opals/spec/lib/spec/example/example_group_methods.rb +142 -0
- data/opals/spec/lib/spec/example/example_group_proxy.rb +41 -0
- data/opals/spec/lib/spec/example/example_methods.rb +73 -0
- data/opals/spec/lib/spec/example/example_proxy.rb +48 -0
- data/opals/spec/lib/spec/expectations.rb +46 -0
- data/opals/spec/lib/spec/expectations/errors.rb +35 -0
- data/opals/spec/lib/spec/expectations/fail_with.rb +37 -0
- data/opals/spec/lib/spec/expectations/handler.rb +48 -0
- data/opals/spec/lib/spec/matchers.rb +50 -0
- data/opals/spec/lib/spec/matchers/be.rb +26 -0
- data/opals/spec/lib/spec/matchers/generated_descriptions.rb +47 -0
- data/opals/spec/lib/spec/matchers/operator_matcher.rb +66 -0
- data/opals/spec/lib/spec/runner.rb +48 -0
- data/opals/spec/lib/spec/runner/example_group_runner.rb +71 -0
- data/opals/spec/lib/spec/runner/formatter/html_formatter.rb +100 -0
- data/opals/spec/lib/spec/runner/formatter/terminal_formatter.rb +82 -0
- data/opals/spec/lib/spec/runner/options.rb +63 -0
- data/opals/spec/lib/spec/runner/reporter.rb +123 -0
- data/opals/spec/resources/index.html +25 -0
- data/opals/spec/resources/spec.css +132 -0
- data/spec/cherry_kit/iseq_spec.rb +38 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/vienna_spec.rb +7 -0
- data/yard/index.html +43 -0
- data/yard/style.css +765 -0
- metadata +312 -49
- data/docs/jarv.rdoc +0 -27
- data/runtime/array.js +0 -153
- data/runtime/class.js +0 -469
- data/runtime/compar.js +0 -73
- data/runtime/dir.js +0 -115
- data/runtime/enum.js +0 -74
- data/runtime/file.js +0 -165
- data/runtime/gem.js +0 -241
- data/runtime/hash.js +0 -181
- data/runtime/load.js +0 -251
- data/runtime/module.js +0 -98
- data/runtime/number.js +0 -148
- data/runtime/object.js +0 -522
- data/runtime/opal.js +0 -200
- data/runtime/parse.js +0 -2218
- data/runtime/range.js +0 -56
- data/runtime/re.js +0 -91
- data/runtime/string.js +0 -199
- data/runtime/variable.js +0 -184
- data/runtime/vm.js +0 -1150
- data/tasks/build.rb +0 -16
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#
|
|
2
|
+
# attributes.rb
|
|
3
|
+
# vienna
|
|
4
|
+
#
|
|
5
|
+
# Created by Adam Beynon.
|
|
6
|
+
# Copyright 2010 Adam Beynon.
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
# in the Software without restriction, including without limitation the rights
|
|
11
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
# furnished to do so, subject to the following conditions:
|
|
14
|
+
#
|
|
15
|
+
# The above copyright notice and this permission notice shall be included in
|
|
16
|
+
# all copies or substantial portions of the Software.
|
|
17
|
+
#
|
|
18
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
24
|
+
# THE SOFTWARE.
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# KeyValueCoding module for Object instances
|
|
29
|
+
class Object
|
|
30
|
+
|
|
31
|
+
def get_attribute(key)
|
|
32
|
+
# if we have a method with the given key
|
|
33
|
+
if respond_to? key
|
|
34
|
+
__send__ key
|
|
35
|
+
# check for a boolean key (key with '?' suffix)
|
|
36
|
+
elsif respond_to? "#{key}?"
|
|
37
|
+
__send__ "#{key}?"
|
|
38
|
+
# just an instance variable of the right name
|
|
39
|
+
elsif instance_variable_defined?("@#{key}")
|
|
40
|
+
instance_variable_get "@#{key}"
|
|
41
|
+
# worst case: just handle as undefined key
|
|
42
|
+
else
|
|
43
|
+
value_for_undefined_key key
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def set_attribute(key, value)
|
|
49
|
+
# First try and use predefined setter key=
|
|
50
|
+
if respond_to? "#{key}="
|
|
51
|
+
__send__ "#{key}=", value
|
|
52
|
+
|
|
53
|
+
# check if we have the instance variable already, and just set it. We must
|
|
54
|
+
# also make KVO aware of the change
|
|
55
|
+
elsif instance_variable_defined?("@#{key}")
|
|
56
|
+
will_change_attribute key
|
|
57
|
+
instance_variable_set "@#{key}", value
|
|
58
|
+
did_change_attribute key
|
|
59
|
+
|
|
60
|
+
# worst case: set as undefined key
|
|
61
|
+
else
|
|
62
|
+
set_value_for_undefined_key value, key
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
value
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def get_path(key_path)
|
|
69
|
+
# simply return value_for_key if not a path
|
|
70
|
+
return get_attribute(key_path) unless key_path.index('.')
|
|
71
|
+
|
|
72
|
+
parts = key_path.split '.'
|
|
73
|
+
object = self
|
|
74
|
+
|
|
75
|
+
# go through each part and update object as chained path
|
|
76
|
+
parts.each do |part|
|
|
77
|
+
object = object.get_attribute part
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
object
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def set_path(key_path, value)
|
|
84
|
+
# simply return set_value_for_key if not a path
|
|
85
|
+
return set_attribute(key_path, value) unless key_path.index('.')
|
|
86
|
+
|
|
87
|
+
parts = key_path.split('.')
|
|
88
|
+
last_part = parts.pop
|
|
89
|
+
object = self
|
|
90
|
+
|
|
91
|
+
parts.each do |part|
|
|
92
|
+
object = object.get_attribute part
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
object.set_attribute last_part, value
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def value_for_undefined_key(key)
|
|
99
|
+
raise "#{self.inspect} is not Key Value Coding compliant for key #{key}"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def set_value_for_undefined_key(value, key)
|
|
103
|
+
raise "#{self.inspect} is not Key Value Coding compliant for key #{key}"
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
module CherryKit
|
|
108
|
+
|
|
109
|
+
module HashKeyValueCoding
|
|
110
|
+
|
|
111
|
+
def get_attribute(key)
|
|
112
|
+
self[key.to_s]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def set_attribute(key, value)
|
|
116
|
+
self[key.to_s] = value
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Object.include CherryKit::KeyValueCoding
|
|
122
|
+
Hash.include CherryKit::HashKeyValueCoding
|
|
123
|
+
|
|
124
|
+
class NilClass
|
|
125
|
+
|
|
126
|
+
def get_attribute(key)
|
|
127
|
+
nil
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Attribute coding works on each array item, rather than on the array itself.
|
|
132
|
+
class Array
|
|
133
|
+
|
|
134
|
+
def get_attribute(key)
|
|
135
|
+
self.map do |object|
|
|
136
|
+
object.get_attribute key
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Calls set on each item belonging to the array
|
|
141
|
+
def set_attribute(key, value)
|
|
142
|
+
self.each do |object|
|
|
143
|
+
object.set_attribute key, value
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#
|
|
2
|
+
# key_value_binding.rb
|
|
3
|
+
# vienna
|
|
4
|
+
#
|
|
5
|
+
# Created by Adam Beynon.
|
|
6
|
+
# Copyright 2010 Adam Beynon.
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
# in the Software without restriction, including without limitation the rights
|
|
11
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
# furnished to do so, subject to the following conditions:
|
|
14
|
+
#
|
|
15
|
+
# The above copyright notice and this permission notice shall be included in
|
|
16
|
+
# all copies or substantial portions of the Software.
|
|
17
|
+
#
|
|
18
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
24
|
+
# THE SOFTWARE.
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
require 'foundation/core/observable'
|
|
28
|
+
|
|
29
|
+
class Object
|
|
30
|
+
|
|
31
|
+
# Exposes the given binding_name on the receiving class. This also defines a
|
|
32
|
+
# method 'key_binding=' for the given key so that its binding information can
|
|
33
|
+
# be set with a hash dynamically. This is more useful for builder when making
|
|
34
|
+
# GUIs, but it can be used from anywhere. It is esentially a shortcut for
|
|
35
|
+
# the more normal Kernel#bind method.
|
|
36
|
+
#
|
|
37
|
+
# @param {Symbol} binding_name to expose
|
|
38
|
+
#
|
|
39
|
+
def self.expose_binding(binding_name)
|
|
40
|
+
define_method("#{binding_name}_binding=") do |binding_options|
|
|
41
|
+
bind binding_name, binding_options
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
module CherryKit
|
|
47
|
+
|
|
48
|
+
module Bindings
|
|
49
|
+
|
|
50
|
+
# Usage:
|
|
51
|
+
#
|
|
52
|
+
# bind :value, :to => some_controller, :path => 'some_key_name'
|
|
53
|
+
#
|
|
54
|
+
# Keys
|
|
55
|
+
# ----
|
|
56
|
+
#
|
|
57
|
+
# Required keys:
|
|
58
|
+
# :to - the object to bind to
|
|
59
|
+
# :path - the path on the given object to bind to
|
|
60
|
+
#
|
|
61
|
+
# Optional keys:
|
|
62
|
+
#
|
|
63
|
+
#
|
|
64
|
+
# @param {Symbol} binding
|
|
65
|
+
# @param {Hash} binding_options
|
|
66
|
+
#
|
|
67
|
+
def bind(binding, binding_options)
|
|
68
|
+
to = binding_options[:to] or raise "binding options must have a :to key"
|
|
69
|
+
key = binding_options[:path].to_s or raise "binding options must have :path key"
|
|
70
|
+
# first make sure we unbind any existing binding
|
|
71
|
+
unbind binding
|
|
72
|
+
|
|
73
|
+
@__ck_bindings[binding] = KVBBindingProxy.new(binding, to, key, nil, self)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def unbind(the_binding)
|
|
77
|
+
# incase this is our first binding for this object
|
|
78
|
+
@__ck_bindings ||= {}
|
|
79
|
+
|
|
80
|
+
binding = @__ck_bindings[the_binding]
|
|
81
|
+
|
|
82
|
+
return unless binding
|
|
83
|
+
# raise "should not get to here yet. need to implement"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Proxy object to manage the notifications between two bound objects.
|
|
87
|
+
# Instances of this class deal with all passed options etc to maintain a
|
|
88
|
+
# performant binding system
|
|
89
|
+
class KVBBindingProxy
|
|
90
|
+
|
|
91
|
+
def initialize(binding, observed, path, options, source)
|
|
92
|
+
@binding = binding
|
|
93
|
+
@observed = observed
|
|
94
|
+
@path = path
|
|
95
|
+
@options = options
|
|
96
|
+
@source = source
|
|
97
|
+
|
|
98
|
+
# observed.add_observer self, key_path, [:new], binding
|
|
99
|
+
|
|
100
|
+
observed.observe(path) do |info|
|
|
101
|
+
update_value_for binding
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# only if initial?
|
|
105
|
+
update_value_for binding
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Send updates values
|
|
109
|
+
def update_value_for(context)
|
|
110
|
+
new_value = @observed.get_path @path
|
|
111
|
+
# transform values
|
|
112
|
+
# new_value = transform_value new_value, @options
|
|
113
|
+
|
|
114
|
+
@source.set_attribute context, new_value
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def transform_value(value, options)
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
Object.include CherryKit::Bindings
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#
|
|
2
|
+
# builder.rb
|
|
3
|
+
# vienna
|
|
4
|
+
#
|
|
5
|
+
# Created by Adam Beynon.
|
|
6
|
+
# Copyright 2010 Adam Beynon.
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
# in the Software without restriction, including without limitation the rights
|
|
11
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
# furnished to do so, subject to the following conditions:
|
|
14
|
+
#
|
|
15
|
+
# The above copyright notice and this permission notice shall be included in
|
|
16
|
+
# all copies or substantial portions of the Software.
|
|
17
|
+
#
|
|
18
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
24
|
+
# THE SOFTWARE.
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
module CherryKit
|
|
29
|
+
|
|
30
|
+
# Builder module is in charge of registering and constructing methods for
|
|
31
|
+
# a DSL like syntax for building up interfaces with default options for
|
|
32
|
+
# classes.
|
|
33
|
+
module Builder
|
|
34
|
+
|
|
35
|
+
# Builder DSL methods added to classes
|
|
36
|
+
module BuilderClassMethods
|
|
37
|
+
|
|
38
|
+
# Register the given builder_name with a set of default options
|
|
39
|
+
# builder_options. Each option given to the builder, once merged with
|
|
40
|
+
# options given on the construction of a builder instance, will be set on
|
|
41
|
+
# the resulting object instance using key value coding.
|
|
42
|
+
#
|
|
43
|
+
# class SomeViewClass < View
|
|
44
|
+
#
|
|
45
|
+
# register_builder :some_view, :background_color => :blue
|
|
46
|
+
#
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
# # create an instance
|
|
50
|
+
# some_view :size => [100, 200], :background_color => :red
|
|
51
|
+
# # => #<SomeViewClass:102923>
|
|
52
|
+
#
|
|
53
|
+
# @param {Symbol} builder_name
|
|
54
|
+
# @param {Hash} builder_options
|
|
55
|
+
# @returns {Class} self
|
|
56
|
+
#
|
|
57
|
+
def register_builder(builder_name, builder_options)
|
|
58
|
+
# puts "registering builder #{builder_name}"
|
|
59
|
+
|
|
60
|
+
builder_class = self
|
|
61
|
+
|
|
62
|
+
CherryKit.define_method(builder_name) do |options, &block|
|
|
63
|
+
# puts "some code here"
|
|
64
|
+
# puts builder_options
|
|
65
|
+
# puts "builder class is #{builder_class}"
|
|
66
|
+
# options = {}
|
|
67
|
+
builder_class.build options
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Create an instance from the receiver class
|
|
72
|
+
def build(builder_options)
|
|
73
|
+
object = allocate
|
|
74
|
+
|
|
75
|
+
object.initialize_from_builder builder_options
|
|
76
|
+
|
|
77
|
+
# now go through each builder_option that is left in hash
|
|
78
|
+
builder_options.each do |key, value|
|
|
79
|
+
# puts "builder setting #{key} to #{value}"
|
|
80
|
+
# object.set_value_for_key value, key
|
|
81
|
+
object.set_attribute key, value
|
|
82
|
+
end
|
|
83
|
+
# simply return our object
|
|
84
|
+
object
|
|
85
|
+
end
|
|
86
|
+
end #BuilderClassMethods
|
|
87
|
+
|
|
88
|
+
# Builder DSL methods that are added to instances
|
|
89
|
+
module BuilderMethods
|
|
90
|
+
|
|
91
|
+
def initialize_from_builder(builder_options)
|
|
92
|
+
# default, just call initialize, no params
|
|
93
|
+
initialize
|
|
94
|
+
end
|
|
95
|
+
end # BuilderMethods
|
|
96
|
+
|
|
97
|
+
end # Builder
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
Object.extend CherryKit::Builder::BuilderClassMethods
|
|
101
|
+
Object.include CherryKit::Builder::BuilderMethods
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#
|
|
2
|
+
# event.rb
|
|
3
|
+
# vienna
|
|
4
|
+
#
|
|
5
|
+
# Created by Adam Beynon.
|
|
6
|
+
# Copyright 2010 Adam Beynon.
|
|
7
|
+
#
|
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
10
|
+
# in the Software without restriction, including without limitation the rights
|
|
11
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
13
|
+
# furnished to do so, subject to the following conditions:
|
|
14
|
+
#
|
|
15
|
+
# The above copyright notice and this permission notice shall be included in
|
|
16
|
+
# all copies or substantial portions of the Software.
|
|
17
|
+
#
|
|
18
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
24
|
+
# THE SOFTWARE.
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
module CherryKit
|
|
28
|
+
|
|
29
|
+
# Module to hold cherry kit additions to the event class. These additions are
|
|
30
|
+
# used for custom handling of events within cherry kit applications.
|
|
31
|
+
#
|
|
32
|
+
module EventAdditions
|
|
33
|
+
|
|
34
|
+
# Returns the View instance that the event originated from. Basically, the
|
|
35
|
+
# native target property is retreieved, and then that element is compared to
|
|
36
|
+
# CherryKits hash of elements => views. The element's parentNode is
|
|
37
|
+
# recursively got until the node has an id (which is used to lookup in the
|
|
38
|
+
# hash table)
|
|
39
|
+
#
|
|
40
|
+
# @returns {CherryKit::View} the view
|
|
41
|
+
#
|
|
42
|
+
def view
|
|
43
|
+
if @view
|
|
44
|
+
return @view
|
|
45
|
+
else
|
|
46
|
+
element = `#{self}.__event__.target || #{self}.__event__.srcElement;`
|
|
47
|
+
`while (element) {
|
|
48
|
+
if (!element.id) {
|
|
49
|
+
element = element.parentNode;
|
|
50
|
+
} else {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}`
|
|
54
|
+
return @view = CherryKit::View[`#{element}.id`]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# manually set view
|
|
59
|
+
def view=(view)
|
|
60
|
+
@view = view
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# location in clinet (browser)
|
|
64
|
+
#
|
|
65
|
+
# @returns {CherryKit::Point} location
|
|
66
|
+
#
|
|
67
|
+
def location_in_client
|
|
68
|
+
return @location_in_client if @location_in_client
|
|
69
|
+
# if we have not cached it, now do it
|
|
70
|
+
event = `#{self}.__event__;`
|
|
71
|
+
|
|
72
|
+
# @location_in_client = { :left => `#{event}.clientX`,
|
|
73
|
+
# :top => `#{event}.clientY` }
|
|
74
|
+
|
|
75
|
+
@location_in_client = Browser::Point.new `#{event}.clientX`, `#{event}.clientY`
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# location of event within designated view
|
|
79
|
+
#
|
|
80
|
+
def location_in_view(view)
|
|
81
|
+
offset = view.render_context.element.element_offset
|
|
82
|
+
client = location_in_client
|
|
83
|
+
|
|
84
|
+
Browser::Point.new(client.x - offset.x, client.y - offset.y)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# CherryKit window for the event
|
|
88
|
+
#
|
|
89
|
+
def window
|
|
90
|
+
@window ||= view.window
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# =================
|
|
95
|
+
# = Touch support =
|
|
96
|
+
# =================
|
|
97
|
+
|
|
98
|
+
def changed_touches
|
|
99
|
+
return @changed_touches if @changed_touches
|
|
100
|
+
@changed_touches = []
|
|
101
|
+
`var event = #{self}.__event__;
|
|
102
|
+
var changed = event.changedTouches;
|
|
103
|
+
for (var i = 0; i < changed.length; i++) {
|
|
104
|
+
#{@changed_touches}.push(#{Touch}.$from_native(changed[i]));
|
|
105
|
+
}`
|
|
106
|
+
@changed_touches
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
Browser::Event.include CherryKit::EventAdditions
|