glimmer 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +109 -2
  3. data/bin/girb +4 -2
  4. data/bin/glimmer +3 -2
  5. data/lib/glimmer.rb +6 -3
  6. data/lib/glimmer/command_handlers.rb +37 -34
  7. data/lib/glimmer/ext/module.rb +20 -0
  8. data/lib/glimmer/launcher.rb +75 -0
  9. data/lib/glimmer/swt/command_handlers/bind_command_handler.rb +55 -0
  10. data/lib/glimmer/swt/command_handlers/color_command_handler.rb +30 -0
  11. data/lib/glimmer/swt/command_handlers/combo_selection_data_binding_command_handler.rb +43 -0
  12. data/lib/glimmer/swt/command_handlers/custom_widget_command_handler.rb +24 -0
  13. data/lib/glimmer/swt/command_handlers/data_binding_command_handler.rb +72 -0
  14. data/lib/glimmer/swt/command_handlers/display_command_handler.rb +20 -0
  15. data/lib/glimmer/swt/command_handlers/layout_command_handler.rb +27 -0
  16. data/lib/glimmer/swt/command_handlers/layout_data_command_handler.rb +26 -0
  17. data/lib/glimmer/swt/command_handlers/list_selection_data_binding_command_handler.rb +48 -0
  18. data/lib/glimmer/swt/command_handlers/property_command_handler.rb +24 -0
  19. data/lib/glimmer/swt/command_handlers/shell_command_handler.rb +20 -0
  20. data/lib/glimmer/swt/command_handlers/tab_item_command_handler.rb +24 -0
  21. data/lib/glimmer/swt/command_handlers/table_column_properties_data_binding_command_handler.rb +28 -0
  22. data/lib/glimmer/swt/command_handlers/table_items_data_binding_command_handler.rb +33 -0
  23. data/lib/glimmer/swt/command_handlers/tree_items_data_binding_command_handler.rb +32 -0
  24. data/lib/glimmer/swt/command_handlers/tree_properties_data_binding_command_handler.rb +28 -0
  25. data/lib/glimmer/swt/command_handlers/widget_command_handler.rb +26 -0
  26. data/lib/glimmer/swt/command_handlers/widget_listener_command_handler.rb +43 -0
  27. data/lib/glimmer/swt/custom_widget.rb +91 -0
  28. data/lib/glimmer/swt/g_color.rb +39 -0
  29. data/lib/glimmer/swt/g_display.rb +28 -0
  30. data/lib/glimmer/swt/g_font.rb +75 -0
  31. data/lib/glimmer/swt/g_layout.rb +72 -0
  32. data/lib/glimmer/swt/g_layout_data.rb +56 -0
  33. data/lib/glimmer/swt/g_runnable.rb +15 -0
  34. data/lib/glimmer/swt/g_shell.rb +50 -0
  35. data/lib/glimmer/swt/g_swt.rb +65 -0
  36. data/lib/glimmer/swt/g_tab_item_composite.rb +34 -0
  37. data/lib/glimmer/swt/g_widget.rb +213 -0
  38. data/lib/glimmer/swt/g_widget_listener.rb +12 -0
  39. data/lib/glimmer/swt/list_selection_binding.rb +49 -0
  40. data/lib/glimmer/swt/model_binding.rb +208 -0
  41. data/lib/glimmer/swt/observable.rb +13 -0
  42. data/lib/glimmer/swt/observable_array.rb +105 -0
  43. data/lib/glimmer/swt/observable_model.rb +107 -0
  44. data/lib/glimmer/swt/observer.rb +117 -0
  45. data/lib/glimmer/swt/proc_tracker.rb +16 -0
  46. data/lib/glimmer/swt/table_items_binding.rb +47 -0
  47. data/lib/glimmer/swt/tree_items_binding.rb +51 -0
  48. data/lib/glimmer/swt/widget_binding.rb +31 -0
  49. data/lib/glimmer/xml/command_handlers/html_command_handler.rb +50 -0
  50. data/lib/glimmer/xml/command_handlers/xml_command_handler.rb +23 -0
  51. data/lib/glimmer/xml/command_handlers/xml_name_space_command_handler.rb +36 -0
  52. data/lib/glimmer/xml/command_handlers/xml_tag_command_handler.rb +28 -0
  53. data/lib/glimmer/xml/command_handlers/xml_text_command_handler.rb +24 -0
  54. data/lib/glimmer/xml/depth_first_search_iterator.rb +20 -0
  55. data/lib/glimmer/xml/name_space_visitor.rb +21 -0
  56. data/lib/glimmer/xml/node.rb +84 -0
  57. data/lib/glimmer/xml/node_visitor.rb +13 -0
  58. data/lib/glimmer/xml/xml_visitor.rb +63 -0
  59. data/lib/glimmer/xml_command_handlers.rb +11 -10
  60. metadata +68 -50
  61. data/lib/glimmer/command_handlers/bind_command_handler.rb +0 -51
  62. data/lib/glimmer/command_handlers/color_command_handler.rb +0 -26
  63. data/lib/glimmer/command_handlers/combo_selection_data_binding_command_handler.rb +0 -40
  64. data/lib/glimmer/command_handlers/data_binding_command_handler.rb +0 -69
  65. data/lib/glimmer/command_handlers/display_command_handler.rb +0 -16
  66. data/lib/glimmer/command_handlers/layout_command_handler.rb +0 -23
  67. data/lib/glimmer/command_handlers/layout_data_command_handler.rb +0 -22
  68. data/lib/glimmer/command_handlers/list_selection_data_binding_command_handler.rb +0 -45
  69. data/lib/glimmer/command_handlers/models/g_color.rb +0 -34
  70. data/lib/glimmer/command_handlers/models/g_display.rb +0 -26
  71. data/lib/glimmer/command_handlers/models/g_font.rb +0 -73
  72. data/lib/glimmer/command_handlers/models/g_layout.rb +0 -71
  73. data/lib/glimmer/command_handlers/models/g_layout_data.rb +0 -55
  74. data/lib/glimmer/command_handlers/models/g_runnable.rb +0 -13
  75. data/lib/glimmer/command_handlers/models/g_shell.rb +0 -49
  76. data/lib/glimmer/command_handlers/models/g_swt.rb +0 -63
  77. data/lib/glimmer/command_handlers/models/g_tab_item_composite.rb +0 -33
  78. data/lib/glimmer/command_handlers/models/g_widget.rb +0 -214
  79. data/lib/glimmer/command_handlers/models/g_widget_listener.rb +0 -11
  80. data/lib/glimmer/command_handlers/models/list_selection_binding.rb +0 -47
  81. data/lib/glimmer/command_handlers/models/model_binding.rb +0 -206
  82. data/lib/glimmer/command_handlers/models/observable.rb +0 -11
  83. data/lib/glimmer/command_handlers/models/observable_array.rb +0 -104
  84. data/lib/glimmer/command_handlers/models/observable_model.rb +0 -105
  85. data/lib/glimmer/command_handlers/models/observer.rb +0 -115
  86. data/lib/glimmer/command_handlers/models/table_items_binding.rb +0 -45
  87. data/lib/glimmer/command_handlers/models/tree_items_binding.rb +0 -49
  88. data/lib/glimmer/command_handlers/models/widget_binding.rb +0 -29
  89. data/lib/glimmer/command_handlers/property_command_handler.rb +0 -21
  90. data/lib/glimmer/command_handlers/shell_command_handler.rb +0 -17
  91. data/lib/glimmer/command_handlers/tab_item_command_handler.rb +0 -21
  92. data/lib/glimmer/command_handlers/table_column_properties_data_binding_command_handler.rb +0 -25
  93. data/lib/glimmer/command_handlers/table_items_data_binding_command_handler.rb +0 -30
  94. data/lib/glimmer/command_handlers/tree_items_data_binding_command_handler.rb +0 -29
  95. data/lib/glimmer/command_handlers/tree_properties_data_binding_command_handler.rb +0 -25
  96. data/lib/glimmer/command_handlers/widget_command_handler.rb +0 -22
  97. data/lib/glimmer/command_handlers/widget_listener_command_handler.rb +0 -39
  98. data/lib/glimmer/xml_command_handlers/html_command_handler.rb +0 -47
  99. data/lib/glimmer/xml_command_handlers/models/depth_first_search_iterator.rb +0 -19
  100. data/lib/glimmer/xml_command_handlers/models/name_space_visitor.rb +0 -20
  101. data/lib/glimmer/xml_command_handlers/models/node.rb +0 -82
  102. data/lib/glimmer/xml_command_handlers/models/node_visitor.rb +0 -11
  103. data/lib/glimmer/xml_command_handlers/models/xml_visitor.rb +0 -61
  104. data/lib/glimmer/xml_command_handlers/xml_command_handler.rb +0 -20
  105. data/lib/glimmer/xml_command_handlers/xml_name_space_command_handler.rb +0 -33
  106. data/lib/glimmer/xml_command_handlers/xml_tag_command_handler.rb +0 -25
  107. data/lib/glimmer/xml_command_handlers/xml_text_command_handler.rb +0 -21
  108. data/lib/glimmer_application.rb +0 -65
@@ -0,0 +1,13 @@
1
+ module Glimmer
2
+ module SWT
3
+ module Observable
4
+ def add_observer(observer, property_or_properties=nil)
5
+ raise 'Not implemented!'
6
+ end
7
+
8
+ def remove_observer(observer, property_or_properties=nil)
9
+ raise 'Not implemented!'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,105 @@
1
+ require 'set'
2
+
3
+ require_relative 'observable'
4
+
5
+ module Glimmer
6
+ module SWT
7
+ # TODO prefix utility methods with double-underscore
8
+ module ObservableArray
9
+ include Observable
10
+
11
+ def add_observer(observer, element_properties=nil)
12
+ return observer if has_observer?(observer) && element_properties.nil?
13
+ property_observer_list << observer
14
+ [element_properties].flatten.compact.each do |property|
15
+ each do |element|
16
+ observer.observe(element, property)
17
+ end
18
+ end
19
+ observer
20
+ end
21
+
22
+ def remove_observer(observer, element_properties=nil)
23
+ property_observer_list.delete(observer)
24
+ [element_properties].flatten.compact.each do |property|
25
+ each do |element|
26
+ observer.unobserve(element, property)
27
+ end
28
+ end
29
+ observer
30
+ end
31
+
32
+ def has_observer?(observer)
33
+ property_observer_list.include?(observer)
34
+ end
35
+
36
+ def property_observer_list
37
+ @property_observer_list ||= Set.new
38
+ end
39
+
40
+ def notify_observers
41
+ property_observer_list.each {|observer| observer.call}
42
+ end
43
+
44
+ def self.extend_object(array)
45
+ array.instance_eval("alias __original_add <<")
46
+ array.instance_eval <<-end_eval, __FILE__, __LINE__
47
+ def <<(value)
48
+ self.__original_add(value)
49
+ notify_observers
50
+ end
51
+ end_eval
52
+
53
+ array.instance_eval("alias __original_set_value []=")
54
+ array.instance_eval <<-end_eval, __FILE__, __LINE__
55
+ def []=(index, value)
56
+ old_value = self[index]
57
+ unregister_dependent_observers(old_value)
58
+ self.__original_set_value(index, value)
59
+ notify_observers
60
+ end
61
+ end_eval
62
+
63
+ array.instance_eval("alias __original_delete delete")
64
+ array.instance_eval <<-end_eval, __FILE__, __LINE__
65
+ def delete(value)
66
+ unregister_dependent_observers(value)
67
+ self.__original_delete(value)
68
+ notify_observers
69
+ end
70
+ end_eval
71
+
72
+ array.instance_eval("alias __original_delete_at delete_at")
73
+ array.instance_eval <<-end_eval, __FILE__, __LINE__
74
+ def delete_at(index)
75
+ old_value = self[index]
76
+ unregister_dependent_observers(old_value)
77
+ self.__original_delete_at(index)
78
+ notify_observers
79
+ end
80
+ end_eval
81
+
82
+ array.instance_eval("alias __original_clear clear")
83
+ array.instance_eval <<-end_eval, __FILE__, __LINE__
84
+ def clear
85
+ each do |old_value|
86
+ unregister_dependent_observers(old_value)
87
+ end
88
+ self.__original_clear
89
+ notify_observers
90
+ end
91
+ end_eval
92
+
93
+ super
94
+ end
95
+
96
+ def unregister_dependent_observers(old_value)
97
+ # TODO look into optimizing this
98
+ return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
99
+ property_observer_list.each do |observer|
100
+ observer.unregister_dependents_with_observable([self, nil], old_value)
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,107 @@
1
+ require 'set'
2
+
3
+ require_relative 'observable'
4
+ require_relative 'observer'
5
+
6
+ module Glimmer
7
+ module SWT
8
+ # TODO prefix utility methods with double-underscore
9
+ module ObservableModel
10
+ include Observable
11
+
12
+ class Notifier
13
+ include Observer
14
+ def initialize(observable_model, property_name)
15
+ @observable_model = observable_model
16
+ @property_name = property_name
17
+ end
18
+ def call(new_value=nil)
19
+ @observable_model.notify_observers(@property_name)
20
+ end
21
+ end
22
+
23
+ def add_observer(observer, property_name)
24
+ return observer if has_observer?(observer, property_name)
25
+ property_observer_list(property_name) << observer
26
+ add_property_writer_observers(property_name)
27
+ observer
28
+ end
29
+
30
+ def remove_observer(observer, property_name)
31
+ property_observer_list(property_name).delete(observer)
32
+ end
33
+
34
+ def has_observer?(observer, property_name)
35
+ property_observer_list(property_name).include?(observer)
36
+ end
37
+
38
+ def has_observer_for_any_property?(observer)
39
+ property_observer_hash.values.map(&:to_a).sum.include?(observer)
40
+ end
41
+
42
+ def property_observer_hash
43
+ @property_observers = Hash.new unless @property_observers
44
+ @property_observers
45
+ end
46
+
47
+ def property_observer_list(property_name)
48
+ property_observer_hash[property_name.to_sym] = Set.new unless property_observer_hash[property_name.to_sym]
49
+ property_observer_hash[property_name.to_sym]
50
+ end
51
+
52
+ def notify_observers(property_name)
53
+ property_observer_list(property_name).each {|observer| observer.call(send(property_name))}
54
+ end
55
+ #TODO upon updating values, make sure dependent observers are cleared (not added as dependents here)
56
+
57
+ def add_property_writer_observers(property_name)
58
+ property_writer_name = "#{property_name}="
59
+ method(property_writer_name)
60
+ ensure_array_object_observer(property_name, send(property_name))
61
+ begin
62
+ method("__original_#{property_writer_name}")
63
+ rescue
64
+ instance_eval "alias __original_#{property_writer_name} #{property_writer_name}"
65
+ instance_eval <<-end_eval, __FILE__, __LINE__
66
+ def #{property_writer_name}(value)
67
+ old_value = self.#{property_name}
68
+ unregister_dependent_observers('#{property_name}', old_value)
69
+ self.__original_#{property_writer_name}(value)
70
+ notify_observers('#{property_name}')
71
+ ensure_array_object_observer('#{property_name}', value, old_value)
72
+ end
73
+ end_eval
74
+ end
75
+ rescue => e
76
+ # ignore writing if no property writer exists
77
+ Glimmer.logger.debug "No need to observe property writer: #{property_writer_name}\n#{e.message}\n#{e.backtrace.join("\n")}"
78
+ end
79
+
80
+ def unregister_dependent_observers(property_name, old_value)
81
+ # TODO look into optimizing this
82
+ return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
83
+ property_observer_list(property_name).each do |observer|
84
+ observer.unregister_dependents_with_observable([self, property_name], old_value)
85
+ end
86
+ end
87
+
88
+ def ensure_array_object_observer(property_name, object, old_object = nil)
89
+ return unless object.is_a?(Array)
90
+ array_object_observer = array_object_observer_for(property_name)
91
+ array_object_observer.observe(object)
92
+ property_observer_list(property_name).each do |observer|
93
+ observer.add_dependent([self, property_name] => [array_object_observer, object, nil])
94
+ end
95
+ array_object_observer_for(property_name).unregister(old_object) if old_object.is_a?(ObservableArray)
96
+ end
97
+
98
+ def array_object_observer_for(property_name)
99
+ @array_object_observers ||= {}
100
+ unless @array_object_observers.has_key?(property_name)
101
+ @array_object_observers[property_name] = ObservableModel::Notifier.new(self, property_name)
102
+ end
103
+ @array_object_observers[property_name]
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,117 @@
1
+ require 'set'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ # Mixin representing Observer trait from Observer Design Pattern
6
+ # Allows classes to include without interfering with their
7
+ # inheritance hierarchy.
8
+ #
9
+ # Includes a default implementation that can receive an observer block
10
+ # Example: Observer.proc {|new_value| puts new_value}
11
+ # Subclasses may override
12
+ module Observer
13
+ # Observer Proc default implementation that takes an observer block to process updates
14
+ # via call method
15
+ class Proc
16
+ include Observer
17
+
18
+ def initialize(&observer_block)
19
+ @observer_block = observer_block
20
+ end
21
+
22
+ # Called by observables once updates occur sending in the new_value if any
23
+ def call(new_value=nil)
24
+ @observer_block.call(new_value)
25
+ end
26
+ end
27
+
28
+ class << self
29
+ def proc(&observer_block)
30
+ Proc.new(&observer_block)
31
+ end
32
+ end
33
+
34
+ def registrations
35
+ @registrations ||= Set.new
36
+ end
37
+
38
+ def registrations_for(observable, property = nil)
39
+ registrations.select {|o, p| o == observable && p == property}
40
+ end
41
+
42
+ # mapping of registrations to dependents
43
+ # {[observable, property] => [[dependent, dependent_observable, dependent_property], ...]}
44
+ def dependents
45
+ @dependents ||= Hash.new
46
+ end
47
+
48
+ def dependents_for(registration)
49
+ dependents[registration] ||= Set.new
50
+ end
51
+
52
+ # registers observer in an observable on a property (optional)
53
+ # observer maintains registration list to unregister later
54
+ def register(observable, property = nil)
55
+ unless observable.is_a?(Observable)
56
+ # TODO refactor code to be more smart/polymorphic/automated and honor open/closed principle
57
+ if observable.is_a?(Array)
58
+ observable.extend(ObservableArray)
59
+ else
60
+ observable.extend(ObservableModel)
61
+ end
62
+ end
63
+ observable.add_observer(*[self, property].compact)
64
+ [observable, property].tap do |registration|
65
+ self.registrations << registration
66
+ end
67
+ end
68
+ alias observe register
69
+
70
+ def unregister(observable, property = nil)
71
+ observable.remove_observer(*[self, property].compact)
72
+ registration = [observable, property]
73
+ dependents_for(registration).each do |dependent|
74
+ dependent_observer, dependent_observable, dependent_property = dependent
75
+ dependent_observer.unregister(dependent_observable, dependent_property)
76
+ remove_dependent(registration => dependent)
77
+ end
78
+ registrations.delete(registration)
79
+ end
80
+ alias unobserve unregister
81
+
82
+ def unregister_dependents_with_observable(registration, dependent_observable)
83
+ thedependents = dependents_for(registration).select do |d_observer, d_observable, d_property|
84
+ d_observable == dependent_observable
85
+ end
86
+ thedependents.each do |d_observer, d_observable, d_property|
87
+ d_observer.unregister(d_observable, d_property)
88
+ end
89
+ end
90
+
91
+ # cleans up all registrations in observables
92
+ def unregister_all_observables
93
+ registrations.each do |observable, property|
94
+ unregister(observable, property)
95
+ end
96
+ end
97
+ alias unobserve_all_observables unregister_all_observables
98
+
99
+ # add dependent observer to unregister when unregistering observer
100
+ def add_dependent(parent_to_dependent_hash)
101
+ observable, property = registration = parent_to_dependent_hash.keys.first
102
+ dependent_observer, dependent_observable, dependent_property = dependent = parent_to_dependent_hash.values.first
103
+ dependents_for(registration) << dependent
104
+ end
105
+
106
+ def remove_dependent(parent_to_dependent_hash)
107
+ observable, property = registration = parent_to_dependent_hash.keys.first
108
+ dependent_observer, dependent_observable, dependent_property = dependent = parent_to_dependent_hash.values.first
109
+ dependents_for(registration).delete(dependent)
110
+ end
111
+
112
+ def call(new_value)
113
+ raise 'Not implemented!'
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,16 @@
1
+ module Glimmer
2
+ module SWT
3
+ class ProcTracker < DelegateClass(Proc)
4
+ def initialize(proc)
5
+ super(proc)
6
+ end
7
+ def call(*args)
8
+ __getobj__.call(*args)
9
+ @called = true
10
+ end
11
+ def called?
12
+ !!@called
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,47 @@
1
+ require_relative 'observable_array'
2
+ require_relative 'observable_model'
3
+ require_relative 'observable'
4
+ require_relative 'observer'
5
+
6
+ module Glimmer
7
+ module SWT
8
+ class TableItemsBinding
9
+ include Glimmer
10
+ include Observable
11
+ include Observer
12
+ include_package 'org.eclipse.swt'
13
+ include_package 'org.eclipse.swt.widgets'
14
+
15
+ def initialize(parent, model_binding, column_properties)
16
+ @table = parent
17
+ @model_binding = model_binding
18
+ @column_properties = column_properties
19
+ call(@model_binding.evaluate_property)
20
+ model = model_binding.base_model
21
+ observe(model, model_binding.property_name_expression)
22
+ add_contents(@table) {
23
+ on_widget_disposed { |dispose_event|
24
+ unregister_all_observables
25
+ }
26
+ }
27
+ end
28
+ def call(model_collection=nil)
29
+ if model_collection and model_collection.is_a?(Array)
30
+ observe(model_collection, @column_properties)
31
+ @model_collection = model_collection
32
+ end
33
+ populate_table(@model_collection, @table, @column_properties)
34
+ end
35
+ def populate_table(model_collection, parent, column_properties)
36
+ parent.widget.removeAll
37
+ model_collection.each do |model|
38
+ table_item = TableItem.new(parent.widget, GSWT[:none])
39
+ for index in 0..(column_properties.size-1)
40
+ table_item.setText(index, model.send(column_properties[index]).to_s)
41
+ end
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'observable_array'
2
+ require_relative 'observable_model'
3
+ require_relative 'observable'
4
+ require_relative 'observer'
5
+
6
+ module Glimmer
7
+ module SWT
8
+ class TreeItemsBinding
9
+ include Glimmer
10
+ include Observable
11
+ include Observer
12
+ include_package 'org.eclipse.swt'
13
+ include_package 'org.eclipse.swt.widgets'
14
+
15
+ def initialize(parent, model_binding, tree_properties)
16
+ @tree = parent
17
+ @model_binding = model_binding
18
+ @tree_properties = [tree_properties].flatten.first.to_h
19
+ call(@model_binding.evaluate_property)
20
+ model = model_binding.base_model
21
+ observe(model, model_binding.property_name_expression)
22
+ add_contents(@tree) {
23
+ on_widget_disposed { |dispose_event|
24
+ unregister_all_observables
25
+ }
26
+ }
27
+ end
28
+ def call(model_tree_root_node=nil)
29
+ if model_tree_root_node and model_tree_root_node.respond_to?(@tree_properties[:children])
30
+ observe(model_tree_root_node, @tree_properties[:text])
31
+ observe(model_tree_root_node, @tree_properties[:children])
32
+ @model_tree_root_node = model_tree_root_node
33
+ end
34
+ populate_tree(@model_tree_root_node, @tree, @tree_properties)
35
+ end
36
+ def populate_tree(model_tree_root_node, parent, tree_properties)
37
+ parent.widget.removeAll
38
+ populate_tree_node(model_tree_root_node, parent.widget, tree_properties)
39
+ end
40
+ def populate_tree_node(model_tree_node, parent, tree_properties)
41
+ table_item = TreeItem.new(parent, GSWT[:none])
42
+ table_item.setText((model_tree_node && model_tree_node.send(tree_properties[:text])).to_s)
43
+ [model_tree_node && model_tree_node.send(tree_properties[:children])].flatten.to_a.compact.each do |child|
44
+ observe(child, @tree_properties[:text])
45
+ populate_tree_node(child, table_item, tree_properties)
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end