glimmer 0.7.8 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +232 -108
  4. data/VERSION +1 -1
  5. data/lib/glimmer.rb +1 -20
  6. data/lib/glimmer/config.rb +0 -13
  7. data/lib/glimmer/dsl/engine.rb +33 -18
  8. data/lib/glimmer/dsl/expression.rb +0 -7
  9. data/lib/glimmer/dsl/static_expression.rb +2 -2
  10. metadata +48 -172
  11. data/RUBY_VERSION +0 -1
  12. data/bin/girb +0 -10
  13. data/bin/girb_runner.rb +0 -13
  14. data/bin/glimmer +0 -5
  15. data/icons/scaffold_app.icns +0 -0
  16. data/lib/glimmer/css/rule.rb +0 -25
  17. data/lib/glimmer/css/style_sheet.rb +0 -19
  18. data/lib/glimmer/data_binding/list_selection_binding.rb +0 -52
  19. data/lib/glimmer/data_binding/model_binding.rb +0 -248
  20. data/lib/glimmer/data_binding/observable.rb +0 -21
  21. data/lib/glimmer/data_binding/observable_array.rb +0 -107
  22. data/lib/glimmer/data_binding/observable_model.rb +0 -108
  23. data/lib/glimmer/data_binding/observable_widget.rb +0 -17
  24. data/lib/glimmer/data_binding/observer.rb +0 -124
  25. data/lib/glimmer/data_binding/shine.rb +0 -23
  26. data/lib/glimmer/data_binding/table_items_binding.rb +0 -47
  27. data/lib/glimmer/data_binding/tree_items_binding.rb +0 -71
  28. data/lib/glimmer/data_binding/widget_binding.rb +0 -33
  29. data/lib/glimmer/dsl/css/css_expression.rb +0 -21
  30. data/lib/glimmer/dsl/css/dsl.rb +0 -10
  31. data/lib/glimmer/dsl/css/dynamic_property_expression.rb +0 -12
  32. data/lib/glimmer/dsl/css/property_expression.rb +0 -22
  33. data/lib/glimmer/dsl/css/pv_expression.rb +0 -17
  34. data/lib/glimmer/dsl/css/rule_expression.rb +0 -25
  35. data/lib/glimmer/dsl/css/s_expression.rb +0 -26
  36. data/lib/glimmer/dsl/swt/async_exec_expression.rb +0 -14
  37. data/lib/glimmer/dsl/swt/bind_expression.rb +0 -37
  38. data/lib/glimmer/dsl/swt/color_expression.rb +0 -19
  39. data/lib/glimmer/dsl/swt/column_properties_expression.rb +0 -24
  40. data/lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb +0 -42
  41. data/lib/glimmer/dsl/swt/custom_widget_expression.rb +0 -36
  42. data/lib/glimmer/dsl/swt/data_binding_expression.rb +0 -34
  43. data/lib/glimmer/dsl/swt/dialog_expression.rb +0 -26
  44. data/lib/glimmer/dsl/swt/display_expression.rb +0 -19
  45. data/lib/glimmer/dsl/swt/dsl.rb +0 -28
  46. data/lib/glimmer/dsl/swt/exec_expression.rb +0 -28
  47. data/lib/glimmer/dsl/swt/layout_data_expression.rb +0 -25
  48. data/lib/glimmer/dsl/swt/layout_expression.rb +0 -27
  49. data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +0 -44
  50. data/lib/glimmer/dsl/swt/menu_bar_expression.rb +0 -33
  51. data/lib/glimmer/dsl/swt/menu_expression.rb +0 -32
  52. data/lib/glimmer/dsl/swt/observe_expression.rb +0 -32
  53. data/lib/glimmer/dsl/swt/property_expression.rb +0 -22
  54. data/lib/glimmer/dsl/swt/rgb_expression.rb +0 -12
  55. data/lib/glimmer/dsl/swt/rgba_expression.rb +0 -12
  56. data/lib/glimmer/dsl/swt/shell_expression.rb +0 -25
  57. data/lib/glimmer/dsl/swt/swt_expression.rb +0 -25
  58. data/lib/glimmer/dsl/swt/sync_exec_expression.rb +0 -15
  59. data/lib/glimmer/dsl/swt/tab_item_expression.rb +0 -33
  60. data/lib/glimmer/dsl/swt/table_items_data_binding_expression.rb +0 -31
  61. data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +0 -31
  62. data/lib/glimmer/dsl/swt/tree_properties_expression.rb +0 -26
  63. data/lib/glimmer/dsl/swt/widget_expression.rb +0 -34
  64. data/lib/glimmer/dsl/swt/widget_listener_expression.rb +0 -32
  65. data/lib/glimmer/dsl/xml/dsl.rb +0 -11
  66. data/lib/glimmer/dsl/xml/html_expression.rb +0 -25
  67. data/lib/glimmer/dsl/xml/meta_expression.rb +0 -23
  68. data/lib/glimmer/dsl/xml/name_space_expression.rb +0 -37
  69. data/lib/glimmer/dsl/xml/node_parent_expression.rb +0 -33
  70. data/lib/glimmer/dsl/xml/tag_expression.rb +0 -29
  71. data/lib/glimmer/dsl/xml/text_expression.rb +0 -22
  72. data/lib/glimmer/dsl/xml/xml_expression.rb +0 -21
  73. data/lib/glimmer/launcher.rb +0 -199
  74. data/lib/glimmer/package.rb +0 -7
  75. data/lib/glimmer/rake_task.rb +0 -89
  76. data/lib/glimmer/scaffold.rb +0 -588
  77. data/lib/glimmer/swt/color_proxy.rb +0 -53
  78. data/lib/glimmer/swt/display_proxy.rb +0 -74
  79. data/lib/glimmer/swt/font_proxy.rb +0 -72
  80. data/lib/glimmer/swt/layout_data_proxy.rb +0 -84
  81. data/lib/glimmer/swt/layout_proxy.rb +0 -82
  82. data/lib/glimmer/swt/menu_proxy.rb +0 -84
  83. data/lib/glimmer/swt/packages.rb +0 -13
  84. data/lib/glimmer/swt/shell_proxy.rb +0 -170
  85. data/lib/glimmer/swt/swt_proxy.rb +0 -106
  86. data/lib/glimmer/swt/tab_item_proxy.rb +0 -65
  87. data/lib/glimmer/swt/tree_proxy.rb +0 -120
  88. data/lib/glimmer/swt/widget_listener_proxy.rb +0 -34
  89. data/lib/glimmer/swt/widget_proxy.rb +0 -489
  90. data/lib/glimmer/ui/custom_shell.rb +0 -45
  91. data/lib/glimmer/ui/custom_widget.rb +0 -244
  92. data/lib/glimmer/util/proc_tracker.rb +0 -16
  93. data/lib/glimmer/xml/depth_first_search_iterator.rb +0 -22
  94. data/lib/glimmer/xml/name_space_visitor.rb +0 -21
  95. data/lib/glimmer/xml/node.rb +0 -75
  96. data/lib/glimmer/xml/node_visitor.rb +0 -13
  97. data/lib/glimmer/xml/xml_visitor.rb +0 -65
  98. data/vendor/swt/linux/swt.jar +0 -0
  99. data/vendor/swt/mac/swt.jar +0 -0
  100. data/vendor/swt/windows/swt.jar +0 -0
@@ -1,13 +0,0 @@
1
- module Glimmer
2
- module SWT
3
- # This contains Java imports of SWT Java packages
4
- module Packages
5
- include_package 'org.eclipse.swt'
6
- include_package 'org.eclipse.swt.widgets'
7
- include_package 'org.eclipse.swt.layout'
8
- include_package 'org.eclipse.swt.graphics'
9
- include_package 'org.eclipse.swt.browser'
10
- include_package 'org.eclipse.swt.custom'
11
- end
12
- end
13
- end
@@ -1,170 +0,0 @@
1
- require 'glimmer/swt/swt_proxy'
2
- require 'glimmer/swt/widget_proxy'
3
- require 'glimmer/swt/display_proxy'
4
- require 'glimmer/swt/swt_proxy'
5
-
6
- module Glimmer
7
- module SWT
8
- # Proxy for org.eclipse.swt.widgets.Shell
9
- #
10
- # Follows the Proxy Design Pattern
11
- class ShellProxy < WidgetProxy
12
- include_package 'org.eclipse.swt.widgets'
13
- include_package 'org.eclipse.swt.layout'
14
-
15
- WIDTH_MIN = 130
16
- HEIGHT_MIN = 0
17
- OBSERVED_MENU_ITEMS = ['about', 'preferences']
18
-
19
- attr_reader :opened_before
20
- alias opened_before? opened_before
21
-
22
- # Instantiates ShellProxy with same arguments expected by SWT Shell
23
- # if swt_widget keyword arg was passed, then it is assumed the shell has already been instantiated
24
- # and the proxy wraps it instead of creating a new one.
25
- def initialize(*args, swt_widget: nil)
26
- if swt_widget
27
- @swt_widget = swt_widget
28
- else
29
- if args.first.is_a?(ShellProxy)
30
- args[0] = args[0].swt_widget
31
- end
32
- style_args = args.select {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}
33
- if style_args.any?
34
- style_arg_start_index = args.index(style_args.first)
35
- style_arg_last_index = args.index(style_args.last)
36
- args[style_arg_start_index..style_arg_last_index] = SWTProxy[style_args]
37
- end
38
- if args.first.nil? || (!args.first.is_a?(Display) && !args.first.is_a?(Shell))
39
- @display = DisplayProxy.instance.swt_display
40
- args = [@display] + args
41
- end
42
- args = args.compact
43
- @swt_widget = Shell.new(*args)
44
- @swt_widget.setLayout(FillLayout.new)
45
- @swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN)
46
- on_event_show do
47
- Thread.new do
48
- sleep(0.25)
49
- async_exec do
50
- @swt_widget.setActive unless @swt_widget.isDisposed
51
- end
52
- end
53
- end
54
- end
55
- @display ||= @swt_widget.getDisplay
56
- end
57
-
58
- # Centers shell within monitor it is in
59
- def center
60
- primary_monitor = @display.getPrimaryMonitor()
61
- monitor_bounds = primary_monitor.getBounds()
62
- shell_bounds = @swt_widget.getBounds()
63
- location_x = monitor_bounds.x + (monitor_bounds.width - shell_bounds.width) / 2
64
- location_y = monitor_bounds.y + (monitor_bounds.height - shell_bounds.height) / 2
65
- @swt_widget.setLocation(location_x, location_y)
66
- end
67
-
68
- # Opens shell and starts SWT's UI thread event loop
69
- def open
70
- if @opened_before
71
- @swt_widget.setVisible(true)
72
- # notify_observers('visible')
73
- else
74
- @opened_before = true
75
- @swt_widget.pack
76
- center
77
- @swt_widget.open
78
- start_event_loop
79
- end
80
- end
81
- alias show open
82
-
83
- def hide
84
- @swt_widget.setVisible(false)
85
- end
86
-
87
- def close
88
- @swt_widget.close
89
- end
90
-
91
- def visible?
92
- @swt_widget.isDisposed ? false : @swt_widget.isVisible
93
- end
94
-
95
- # Setting to true opens/shows shell. Setting to false hides the shell.
96
- def visible=(visibility)
97
- visibility ? show : hide
98
- end
99
-
100
- def pack
101
- @swt_widget.pack
102
- end
103
-
104
- def pack_same_size
105
- bounds = @swt_widget.getBounds
106
- width = @swt_widget.getBounds.width
107
- height = @swt_widget.getBounds.height
108
- x = @swt_widget.getBounds.x
109
- y = @swt_widget.getBounds.y
110
- @swt_widget.pack
111
- @swt_widget.setSize(width, height)
112
- @swt_widget.setLocation(x, y)
113
- end
114
-
115
- def content(&block)
116
- Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::ShellExpression.new, &block)
117
- end
118
-
119
- # (happens as part of `#open`)
120
- # Starts SWT Event Loop.
121
- #
122
- # You may learn more about the SWT Event Loop here:
123
- # https://help.eclipse.org/2019-12/nftopic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html
124
- # This method is not needed except in rare circumstances where there is a need to start the SWT Event Loop before opening the shell.
125
- def start_event_loop
126
- until @swt_widget.isDisposed
127
- @display.sleep unless @display.readAndDispatch
128
- end
129
- end
130
-
131
- def can_handle_observation_request?(observation_request)
132
- result = false
133
- if observation_request.start_with?('on_')
134
- event_name = observation_request.sub(/^on_/, '')
135
- result = OBSERVED_MENU_ITEMS.include?(event_name)
136
- end
137
- result || super
138
- end
139
-
140
- def handle_observation_request(observation_request, &block)
141
- if observation_request.start_with?('on_')
142
- event_name = observation_request.sub(/^on_/, '')
143
- if OBSERVED_MENU_ITEMS.include?(event_name)
144
- if OS.mac?
145
- system_menu = DisplayProxy.instance.swt_display.getSystemMenu
146
- menu_item = system_menu.getItems.find {|menu_item| menu_item.getID == SWTProxy["ID_#{event_name.upcase}"]}
147
- menu_item.addListener(SWTProxy[:Selection], &block)
148
- end
149
- else
150
- super
151
- end
152
- end
153
- end
154
-
155
- def add_observer(observer, property_name)
156
- case property_name.to_s
157
- when 'visible?' #TODO see if you must handle non-? version and/or move elsewhere
158
- visibility_notifier = proc do
159
- observer.call(visible?)
160
- end
161
- on_event_show(&visibility_notifier)
162
- on_event_hide(&visibility_notifier)
163
- on_event_close(&visibility_notifier)
164
- else
165
- super
166
- end
167
- end
168
- end
169
- end
170
- end
@@ -1,106 +0,0 @@
1
- require 'glimmer/error'
2
-
3
- module Glimmer
4
- module SWT # TODO Consider making this the class below to ease calling it
5
- # Proxy for org.eclipse.swt.SWT
6
- #
7
- # Follows the Proxy Design Pattern
8
- class SWTProxy
9
- class << self
10
- java_import 'org.eclipse.swt.SWT'
11
-
12
- ERROR_INVALID_STYLE = " is an invalid SWT style! Please choose a style from org.eclipse.swt.SWT class constants."
13
- REGEX_SYMBOL_NEGATIVITY = /^([^!]+)(!)?$/
14
-
15
- # Gets SWT constants as if calling SWT::CONSTANT where constant is
16
- # passed in as a lower case symbol
17
- def [](*symbols)
18
- symbols = symbols.first if symbols.size == 1 && symbols.first.is_a?(Array)
19
- result = symbols.compact.map do |symbol|
20
- constant(symbol).tap do |constant_value|
21
- raise Error, symbol.to_s + ERROR_INVALID_STYLE unless constant_value.is_a?(Integer)
22
- end
23
- end.reduce do |output, constant_value|
24
- if constant_value < 0
25
- output & constant_value
26
- else
27
- output | constant_value
28
- end
29
- end
30
- result.nil? ? SWT::NONE : result
31
- end
32
-
33
- # Returns SWT style integer value for passed in symbol or allows
34
- # passed in object to pass through (e.g. Integer). This makes is convenient
35
- # to use symbols or actual SWT style integers in Glimmer
36
- # Does not raise error for invalid values. Just lets them pass as is.
37
- # (look into [] operator if you want an error raised on invalid values)
38
- def constant(symbol)
39
- return symbol unless symbol.is_a?(Symbol) || symbol.is_a?(String)
40
- symbol_string, negative = extract_symbol_string_negativity(symbol)
41
- swt_constant_symbol = symbol_string.downcase == symbol_string ? symbol_string.upcase.to_sym : symbol_string.to_sym
42
- bit_value = SWT.const_get(swt_constant_symbol)
43
- negative ? ~bit_value : bit_value
44
- rescue => e
45
- begin
46
- # Glimmer::Config.logger&.debug(e.full_message)
47
- alternative_swt_constant_symbol = SWT.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s.upcase}
48
- bit_value = SWT.const_get(alternative_swt_constant_symbol)
49
- negative ? ~bit_value : bit_value
50
- rescue => e
51
- # Glimmer::Config.logger&.debug(e.full_message)
52
- bit_value = Glimmer::SWT::SWTProxy::EXTRA_STYLES[swt_constant_symbol]
53
- if bit_value
54
- negative ? ~bit_value : bit_value
55
- else
56
- symbol
57
- end
58
- end
59
- end
60
-
61
- def extract_symbol_string_negativity(symbol)
62
- if symbol.is_a?(Symbol) || symbol.is_a?(String)
63
- symbol_negativity_match = symbol.to_s.match(REGEX_SYMBOL_NEGATIVITY)
64
- symbol = symbol_negativity_match[1]
65
- negative = !!symbol_negativity_match[2]
66
- [symbol, negative]
67
- else
68
- negative = symbol < 0
69
- [symbol, negative]
70
- end
71
- end
72
-
73
- def negative?(symbol)
74
- extract_symbol_string_negativity(symbol)[1]
75
- end
76
-
77
- def has_constant?(symbol)
78
- return false unless symbol.is_a?(Symbol) || symbol.is_a?(String)
79
- constant(symbol).is_a?(Integer)
80
- end
81
-
82
- def constantify_args(args)
83
- args.map {|arg| constant(arg)}
84
- end
85
-
86
- # Deconstructs a style integer into symbols
87
- # Useful for debugging
88
- def deconstruct(integer)
89
- SWT.constants.reduce([]) do |found, c|
90
- constant_value = SWT.const_get(c) rescue -1
91
- is_found = constant_value.is_a?(Integer) && (constant_value & integer) == constant_value
92
- is_found ? found += [c] : found
93
- end
94
- end
95
-
96
- def include?(swt_constant, *symbols)
97
- swt_constant & self[symbols] == self[symbols]
98
- end
99
- end
100
-
101
- EXTRA_STYLES = {
102
- NO_RESIZE: self[:shell_trim, :resize!, :max!]
103
- }
104
- end
105
- end
106
- end
@@ -1,65 +0,0 @@
1
- require 'glimmer/swt/widget_proxy'
2
-
3
- module Glimmer
4
- module SWT
5
- # Proxy for org.eclipse.swt.widgets.TabItem
6
- #
7
- # Functions differently from other widget proxies.
8
- #
9
- # Glimmer instantiates an SWT Composite alongside the SWT TabItem
10
- # and returns it for `#swt_widget` to allow adding widgets into it.
11
- #
12
- # In order to get the SWT TabItem object, one must call `#swt_tab_item`.
13
- #
14
- # Behind the scenes, this creates a tab item widget proxy separately from a composite that
15
- # is set as the control of the tab item and `#swt_widget`.
16
- #
17
- # In order to retrieve the tab item widget proxy, one must call `#widget_proxy`
18
- #
19
- # Follows the Proxy Design Pattern
20
- class TabItemProxy < WidgetProxy
21
- include_package 'org.eclipse.swt.widgets'
22
-
23
- attr_reader :widget_proxy, :swt_tab_item
24
-
25
- def initialize(parent, style, &contents)
26
- super("composite", parent, style, &contents)
27
- @widget_proxy = SWT::WidgetProxy.new('tab_item', parent, style)
28
- @swt_tab_item = @widget_proxy.swt_widget
29
- @widget_proxy.swt_widget.control = self.swt_widget
30
- end
31
-
32
- def has_attribute?(attribute_name, *args)
33
- if attribute_name.to_s == "text"
34
- true
35
- else
36
- super(attribute_name, *args)
37
- end
38
- end
39
-
40
- def set_attribute(attribute_name, *args)
41
- attribute_name
42
- if attribute_name.to_s == "text"
43
- text_value = args[0]
44
- @swt_tab_item.setText text_value
45
- else
46
- super(attribute_name, *args)
47
- end
48
- end
49
-
50
- def get_attribute(attribute_name)
51
- if attribute_name.to_s == "text"
52
- @swt_tab_item.getText
53
- else
54
- super(attribute_name)
55
- end
56
- end
57
-
58
- def dispose
59
- swt_tab_item.setControl(nil)
60
- swt_widget.dispose
61
- swt_tab_item.dispose
62
- end
63
- end
64
- end
65
- end
@@ -1,120 +0,0 @@
1
- require 'glimmer/swt/widget_proxy'
2
-
3
- module Glimmer
4
- module SWT
5
- class TreeProxy < Glimmer::SWT::WidgetProxy
6
- include Glimmer
7
-
8
- attr_reader :tree_editor, :tree_editor_text_proxy
9
- attr_accessor :tree_properties
10
-
11
- def initialize(underscored_widget_name, parent, args)
12
- super
13
- @tree_editor = TreeEditor.new(swt_widget)
14
- @tree_editor.horizontalAlignment = SWTProxy[:left]
15
- @tree_editor.grabHorizontal = true
16
- @tree_editor.minimumHeight = 20
17
- end
18
-
19
- # Performs depth first search for tree items matching block condition
20
- # If no condition block is passed, returns all tree items
21
- # Returns a Java TreeItem array to easily set as selection on org.eclipse.swt.Tree if needed
22
- def depth_first_search(&condition)
23
- found = []
24
- recursive_depth_first_search(swt_widget.getItems.first, found, &condition)
25
- found.to_java(TreeItem)
26
- end
27
-
28
- # Returns all tree items including descendants
29
- def all_tree_items
30
- depth_first_search
31
- end
32
-
33
- def widget_property_listener_installers
34
- super.merge({
35
- Java::OrgEclipseSwtWidgets::Tree => {
36
- selection: lambda do |observer|
37
- on_widget_selected { |selection_event|
38
- observer.call(@swt_widget.getSelection)
39
- }
40
- end
41
- },
42
- })
43
- end
44
-
45
- def edit_in_progress?
46
- !!@edit_in_progress
47
- end
48
-
49
- def edit_selected_tree_item(before_write: nil, after_write: nil, after_cancel: nil)
50
- edit_tree_item(swt_widget.getSelection.first, before_write: before_write, after_write: after_write, after_cancel: after_cancel)
51
- end
52
-
53
- def edit_tree_item(tree_item, before_write: nil, after_write: nil, after_cancel: nil)
54
- return if tree_item.nil?
55
- content {
56
- @tree_editor_text_proxy = text {
57
- focus true
58
- text tree_item.getText
59
- action_taken = false
60
- cancel = lambda {
61
- @tree_editor_text_proxy.swt_widget.dispose
62
- @tree_editor_text_proxy = nil
63
- after_cancel&.call
64
- @edit_in_progress = false
65
- }
66
- action = lambda { |event|
67
- if !action_taken && !@edit_in_progress
68
- action_taken = true
69
- @edit_in_progress = true
70
- new_text = @tree_editor_text_proxy.swt_widget.getText
71
- if new_text == tree_item.getText
72
- cancel.call
73
- else
74
- before_write&.call
75
- tree_item.setText(new_text)
76
- model = tree_item.getData
77
- model.send("#{tree_properties[:text]}=", new_text) # makes tree update itself, so must search for selected tree item again
78
- edited_tree_item = depth_first_search { |ti| ti.getData == model }.first
79
- swt_widget.showItem(edited_tree_item)
80
- @tree_editor_text_proxy.swt_widget.dispose
81
- @tree_editor_text_proxy = nil
82
- after_write&.call(edited_tree_item)
83
- @edit_in_progress = false
84
- end
85
- end
86
- }
87
- on_focus_lost(&action)
88
- on_key_pressed { |key_event|
89
- if key_event.keyCode == swt(:cr)
90
- action.call(key_event)
91
- elsif key_event.keyCode == swt(:esc)
92
- cancel.call
93
- end
94
- }
95
- }
96
- @tree_editor_text_proxy.swt_widget.selectAll
97
- }
98
- @tree_editor.setEditor(@tree_editor_text_proxy.swt_widget, tree_item);
99
- end
100
-
101
- private
102
-
103
- def recursive_depth_first_search(tree_item, found, &condition)
104
- return if tree_item.nil?
105
- found << tree_item if condition.nil? || condition.call(tree_item)
106
- tree_item.getItems.each do |child_tree_item|
107
- recursive_depth_first_search(child_tree_item, found, &condition)
108
- end
109
- end
110
-
111
- def property_type_converters
112
- super.merge({
113
- selection: lambda do |value|
114
- depth_first_search {|ti| ti.getData == value}
115
- end,
116
- })
117
- end
118
- end
119
- end
120
- end