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,304 @@
|
|
|
1
|
+
#
|
|
2
|
+
# table_view.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/views/control'
|
|
28
|
+
|
|
29
|
+
module CherryKit
|
|
30
|
+
|
|
31
|
+
class TableViewDesktop < Control
|
|
32
|
+
|
|
33
|
+
class_names 'ck-table-view'
|
|
34
|
+
|
|
35
|
+
def initialize(layout)
|
|
36
|
+
super layout
|
|
37
|
+
# default row height..get from theme?
|
|
38
|
+
@row_height = 23
|
|
39
|
+
@table_columns = []
|
|
40
|
+
# views used for rendering cells. Hash of column => array of views
|
|
41
|
+
@table_column_views = {}
|
|
42
|
+
# default row indexes - none
|
|
43
|
+
@selected_row_indexes = IndexSet.new
|
|
44
|
+
# by default allow no row selection
|
|
45
|
+
@allows_empty_selection = true
|
|
46
|
+
# default single selection only
|
|
47
|
+
@allows_multiple_selection = false
|
|
48
|
+
# keep tabs on what needs drawing or updating
|
|
49
|
+
@dirty_rows = []
|
|
50
|
+
# keep tabs on what columns need drawing/updating
|
|
51
|
+
@dirty_columns = []
|
|
52
|
+
# the methods that data source has implemented
|
|
53
|
+
@data_source_methods = []
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# add table column
|
|
57
|
+
def <<(column)
|
|
58
|
+
@table_columns << column
|
|
59
|
+
column.table_view = self
|
|
60
|
+
self.needs_display = true
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def remove_table_column(column)
|
|
64
|
+
return unless column.table_view == self
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# set all columns in one go
|
|
68
|
+
#
|
|
69
|
+
# @param {Array} columns
|
|
70
|
+
#
|
|
71
|
+
def table_columns=(columns)
|
|
72
|
+
columns.each do |column|
|
|
73
|
+
self << column
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def data_source=(data_source)
|
|
78
|
+
return if @data_source == data_source
|
|
79
|
+
|
|
80
|
+
@data_source = data_source
|
|
81
|
+
@data_source_methods = []
|
|
82
|
+
|
|
83
|
+
unless @data_source.respond_to? :number_of_rows_in_table_view
|
|
84
|
+
raise "TableView delegate #{@data_source} does not respond to 'number_of_rows_in_table_view'"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
unless @data_source.respond_to? :value_for_table_view_at
|
|
88
|
+
raise "TableView delegate #{@data_source} does not respond to 'value_for_table_view_at'"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
if @data_source.respond_to? :table_view_write_rows_to_pasteboard
|
|
92
|
+
@data_source_methods << :table_view_write_rows_to_pasteboard
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
reload_data
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def reload_data
|
|
99
|
+
@reload_all_data = true
|
|
100
|
+
note_number_of_rows_changed
|
|
101
|
+
self.needs_display = true
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def note_number_of_rows_changed
|
|
105
|
+
@number_of_rows = nil
|
|
106
|
+
@number_of_rows = number_of_rows
|
|
107
|
+
|
|
108
|
+
# puts "no rows: #{@number_of_rows}"
|
|
109
|
+
self.needs_display = true
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def number_of_rows
|
|
113
|
+
return @number_of_rows if @number_of_rows
|
|
114
|
+
|
|
115
|
+
# data source for now
|
|
116
|
+
if @data_source
|
|
117
|
+
return @data_source.number_of_rows_in_table_view self
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
0
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def create_renderer(theme)
|
|
124
|
+
theme.table_view self
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def update_renderer
|
|
128
|
+
super
|
|
129
|
+
|
|
130
|
+
_update_render_rows
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Private method. Whenever we redisplay, this method is called to render
|
|
134
|
+
# the rows for the table... if it needs it.
|
|
135
|
+
#
|
|
136
|
+
# If we do not need to reload all data, then only @dirty_rows will be
|
|
137
|
+
# updated. Typically these are rows that either were selected, or ones that
|
|
138
|
+
# are now selected.
|
|
139
|
+
#
|
|
140
|
+
def _update_render_rows
|
|
141
|
+
# if everything must be reloaded..
|
|
142
|
+
if @reload_all_data
|
|
143
|
+
# completely re render
|
|
144
|
+
_render_data_views_for
|
|
145
|
+
@reload_all_data = false
|
|
146
|
+
else
|
|
147
|
+
# call this for all new rows.. or, call _update_data_views_for() for
|
|
148
|
+
# rows that need update (were selected/no longer selected, or their data
|
|
149
|
+
# changed etc)
|
|
150
|
+
_update_data_views_for
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def _render_data_views_for(rows, columns)
|
|
155
|
+
@table_columns.each do |column|
|
|
156
|
+
# go through each table unless we should not render it (hidden)
|
|
157
|
+
unless column.hidden?
|
|
158
|
+
puts "need to render #{column}"
|
|
159
|
+
|
|
160
|
+
@table_column_views[column] = @table_column_views[column] || []
|
|
161
|
+
|
|
162
|
+
(0).upto(number_of_rows - 1) do |row|
|
|
163
|
+
puts "need to render row #{row}"
|
|
164
|
+
view = _create_data_view_for(row, column)
|
|
165
|
+
frame = _frame_of_data_view_at(row, column)
|
|
166
|
+
view.layout = {
|
|
167
|
+
:left => frame.x,
|
|
168
|
+
:top => frame.y,
|
|
169
|
+
:width => frame.width,
|
|
170
|
+
:height => frame.height
|
|
171
|
+
}
|
|
172
|
+
view.value = _table_data_value_for row, column
|
|
173
|
+
|
|
174
|
+
view.selected = row_selected? row
|
|
175
|
+
|
|
176
|
+
puts "view is #{view}"
|
|
177
|
+
|
|
178
|
+
add_subview(view) unless view.superview == self
|
|
179
|
+
# @table_column_data_views[table_column][row] = view
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def _update_data_views_for()
|
|
186
|
+
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def _create_data_view_for(row, column)
|
|
190
|
+
column._create_data_view_for_row row
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def _frame_of_data_view_at(row, column)
|
|
194
|
+
row_rect = rect_of_row row
|
|
195
|
+
column_rect = rect_of_column column
|
|
196
|
+
|
|
197
|
+
Rect.new column_rect.x, row_rect.y, column_rect.width, row_rect.height
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def rect_of_row(row)
|
|
201
|
+
Rect.new(0, row * @row_height, 200, @row_height)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def rect_of_column(column)
|
|
205
|
+
Rect.new(@table_columns.index(column) * 100, 0, 100, 200)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def row_at_point(point)
|
|
209
|
+
row = (point.y / @row_height).to_i
|
|
210
|
+
|
|
211
|
+
`if (#{row} >= #{@number_of_rows}) {
|
|
212
|
+
return #{nil};
|
|
213
|
+
}
|
|
214
|
+
return #{row};`
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# Gets the data for the row at the given column (by data source, or by
|
|
218
|
+
# bindings)
|
|
219
|
+
def _table_data_value_for(row, column)
|
|
220
|
+
@data_source.value_for_table_view_at row, column
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def start_tracking?(location)
|
|
224
|
+
row = row_at_point location
|
|
225
|
+
|
|
226
|
+
@start_tracking_location = location
|
|
227
|
+
# @start_tracking_time = Time.now
|
|
228
|
+
|
|
229
|
+
if @allows_empty_selection && row == nil
|
|
230
|
+
select_row_indexes IndexSet.new, false
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# send a note that we are changing selection
|
|
234
|
+
notify :table_view_selection_is_changing
|
|
235
|
+
|
|
236
|
+
# if we have a row, select it
|
|
237
|
+
if row && !@data_source_methods.include?(:table_view_write_rows_to_pasteboard)
|
|
238
|
+
# puts "need to _update)wutg_selection"
|
|
239
|
+
_update_with_selection_at_row row
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def stop_tracking(location)
|
|
244
|
+
puts "stop trackinhg.. tableview"
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def continue_tracking?(location)
|
|
248
|
+
row = row_at_point location
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# mouse event has caused us to select the given row (mouse is there now)
|
|
252
|
+
def _update_with_selection_at_row(row)
|
|
253
|
+
return unless row
|
|
254
|
+
|
|
255
|
+
if @allows_multiple_selection
|
|
256
|
+
puts "allows multiple selection!"
|
|
257
|
+
indexes = @selected_row_indexes
|
|
258
|
+
indexes.add_index row
|
|
259
|
+
elsif row < @number_of_rows
|
|
260
|
+
# single selection only, so set our selection indexes to just this row -
|
|
261
|
+
# only if row exists (< number_of_rows)
|
|
262
|
+
indexes = IndexSet.new row
|
|
263
|
+
else
|
|
264
|
+
puts "deselect all rows!"
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# if our selection hasnt actually changed, lets ignore
|
|
268
|
+
return if @selected_row_indexes == indexes
|
|
269
|
+
|
|
270
|
+
return if !@allows_empty_selection && indexes.count == 0
|
|
271
|
+
|
|
272
|
+
select_row_indexes indexes, false
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def select_row_indexes(indexes, extend_selection)
|
|
276
|
+
if extend_selection
|
|
277
|
+
new_indexes = @selected_row_indexes.dup
|
|
278
|
+
new_indexes.add_indexes indexes
|
|
279
|
+
else
|
|
280
|
+
new_indexes = indexes.dup
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
self._selected_row_indexes = new_indexes
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
def _selected_row_indexes=(indexes)
|
|
287
|
+
old_indexes = @selected_row_indexes.dup
|
|
288
|
+
puts "setting indexes #{indexes.length}"
|
|
289
|
+
@selected_row_indexes = indexes
|
|
290
|
+
self.needs_display = true
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
# Returns whether or not the given row index is selected
|
|
294
|
+
#
|
|
295
|
+
# @param {Number} index to check
|
|
296
|
+
# @returns {true|false}
|
|
297
|
+
#
|
|
298
|
+
def row_selected?(index)
|
|
299
|
+
@selected_row_indexes.include? index
|
|
300
|
+
# true
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
end
|
|
304
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#
|
|
2
|
+
# array_controller.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/controllers/object_controller'
|
|
28
|
+
|
|
29
|
+
module CherryKit
|
|
30
|
+
|
|
31
|
+
class ArrayController < ObjectController
|
|
32
|
+
|
|
33
|
+
expose_binding :content_array
|
|
34
|
+
|
|
35
|
+
attr_accessor :content_array
|
|
36
|
+
|
|
37
|
+
attr_writer :preserves_selection
|
|
38
|
+
|
|
39
|
+
def preserves_selection?
|
|
40
|
+
@preserves_selection
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def content=(content)
|
|
44
|
+
# make sure content is an array
|
|
45
|
+
# unless content.is_a? Array
|
|
46
|
+
# content = [content]
|
|
47
|
+
# end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#
|
|
2
|
+
# controller.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/bindings'
|
|
28
|
+
|
|
29
|
+
module CherryKit
|
|
30
|
+
|
|
31
|
+
class Controller
|
|
32
|
+
|
|
33
|
+
def initialize
|
|
34
|
+
@editors = []
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Returns whether or not this controller is currently editing content
|
|
38
|
+
#
|
|
39
|
+
# @returns true or false
|
|
40
|
+
#
|
|
41
|
+
def editing?
|
|
42
|
+
@editors.length > 0
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def commit_editing?
|
|
46
|
+
return true if @editors.length == 0
|
|
47
|
+
|
|
48
|
+
result = true
|
|
49
|
+
|
|
50
|
+
@editors.each do |editor|
|
|
51
|
+
unless editor.commit_editing?
|
|
52
|
+
result = false
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
result
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def discard_editing
|
|
60
|
+
@editors.each do |editor|
|
|
61
|
+
editor.discard_editing
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def object_did_begin_editing(editor)
|
|
66
|
+
@editors << editor
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def object_did_end_editing(editor)
|
|
70
|
+
@editors.delete editor
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#
|
|
2
|
+
# controller_selection_proxy.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
|
+
class ControllerSelectionProxy
|
|
30
|
+
|
|
31
|
+
def initialize(controller)
|
|
32
|
+
@controller = controller
|
|
33
|
+
@values = {}
|
|
34
|
+
@proxies = []
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def controller_will_change
|
|
38
|
+
puts "controller_will_change"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def controller_did_change
|
|
42
|
+
puts "controller_did_change"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def get_attribute(attribute)
|
|
46
|
+
attribute = attribute.to_s
|
|
47
|
+
value = @values[attribute]
|
|
48
|
+
return value if value
|
|
49
|
+
|
|
50
|
+
values = @controller.selected_objects.get_path attribute
|
|
51
|
+
length = values.length
|
|
52
|
+
|
|
53
|
+
if length == 0
|
|
54
|
+
value = :no_selection
|
|
55
|
+
elsif length == 1
|
|
56
|
+
value = values[0]
|
|
57
|
+
else
|
|
58
|
+
value = :selected_objects_many
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
@values[attribute] = value
|
|
62
|
+
|
|
63
|
+
value
|
|
64
|
+
# puts "values: #{values.inspect}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|