glimmer 0.1.0.0 → 0.1.2
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/.rvmrc +1 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +20 -0
- data/README.markdown +54 -0
- data/Rakefile +54 -0
- data/VERSION +1 -0
- data/bin/glimmer +132 -0
- data/glimmer.gemspec +145 -0
- data/images/Bitter-sweet.jpg +0 -0
- data/{src → lib}/command_handler.rb +7 -10
- data/{src → lib}/command_handler_chain_factory.rb +29 -22
- data/{src → lib}/command_handler_chain_link.rb +19 -22
- data/{src → lib}/command_handlers.rb +29 -26
- data/{src → lib}/command_handlers/bind_command_handler.rb +25 -28
- data/lib/command_handlers/combo_selection_data_binding_command_handler.rb +39 -0
- data/{src → lib}/command_handlers/data_binding_command_handler.rb +61 -64
- data/lib/command_handlers/list_selection_data_binding_command_handler.rb +42 -0
- data/lib/command_handlers/models/list_observer.rb +31 -0
- data/{src → lib}/command_handlers/models/model_observer.rb +28 -25
- data/{src → lib}/command_handlers/models/observable_array.rb +53 -46
- data/lib/command_handlers/models/observable_model.rb +61 -0
- data/{src → lib}/command_handlers/models/r_runnable.rb +11 -14
- data/{src → lib}/command_handlers/models/r_shell.rb +23 -26
- data/lib/command_handlers/models/r_tab_item_composite.rb +25 -0
- data/{src → lib}/command_handlers/models/r_widget.rb +16 -14
- data/lib/command_handlers/models/r_widget_listener.rb +9 -0
- data/{src → lib}/command_handlers/models/r_widget_packages.rb +5 -8
- data/{src → lib}/command_handlers/models/table_items_updater.rb +38 -39
- data/{src → lib}/command_handlers/models/widget_observer.rb +4 -6
- data/{src → lib}/command_handlers/shell_command_handler.rb +14 -17
- data/{src → lib}/command_handlers/swt_constant_command_handler.rb +18 -21
- data/lib/command_handlers/tab_item_command_handler.rb +22 -0
- data/{src → lib}/command_handlers/table_column_properties_data_binding_command_handler.rb +20 -23
- data/{src → lib}/command_handlers/table_items_data_binding_command_handler.rb +26 -29
- data/{src → lib}/command_handlers/widget_command_handler.rb +22 -25
- data/{src → lib}/command_handlers/widget_listener_command_handler.rb +36 -34
- data/{src → lib}/command_handlers/widget_method_command_handler.rb +18 -21
- data/{src → lib}/glimmer.rb +52 -45
- data/lib/parent.rb +5 -0
- data/{src → lib}/shine.rb +21 -24
- data/{src → lib}/xml_command_handlers.rb +15 -18
- data/{src → lib}/xml_command_handlers/html_command_handler.rb +45 -49
- data/{src → lib}/xml_command_handlers/models/depth_first_search_iterator.rb +17 -20
- data/{src → lib}/xml_command_handlers/models/name_space_visitor.rb +17 -20
- data/{src → lib}/xml_command_handlers/models/node.rb +80 -83
- data/{src → lib}/xml_command_handlers/models/node_visitor.rb +8 -11
- data/{src → lib}/xml_command_handlers/models/xml_visitor.rb +58 -61
- data/{src → lib}/xml_command_handlers/xml_command_handler.rb +18 -22
- data/{src → lib}/xml_command_handlers/xml_name_space_command_handler.rb +31 -34
- data/{src → lib}/xml_command_handlers/xml_tag_command_handler.rb +23 -26
- data/{src → lib}/xml_command_handlers/xml_text_command_handler.rb +19 -22
- data/samples/contactmanager/contact.rb +0 -3
- data/samples/contactmanager/contact_manager.rb +1 -4
- data/samples/contactmanager/contact_manager_presenter.rb +0 -3
- data/samples/contactmanager/contact_repository.rb +0 -3
- data/samples/hello_combo.rb +32 -0
- data/samples/hello_world.rb +1 -4
- data/samples/login.rb +1 -4
- data/samples/tictactoe/tic_tac_toe.rb +2 -5
- data/samples/tictactoe/tic_tac_toe_board.rb +0 -3
- data/test/glimmer_combo_data_binding_test.rb +131 -0
- data/test/glimmer_constant_test.rb +6 -11
- data/test/glimmer_data_binding_test.rb +16 -16
- data/test/glimmer_list_data_binding_test.rb +223 -0
- data/test/glimmer_listeners_test.rb +6 -6
- data/test/glimmer_shine_data_binding_test.rb +7 -6
- data/test/glimmer_tab_item_test.rb +61 -0
- data/test/glimmer_table_data_binding_test.rb +7 -20
- data/test/glimmer_test.rb +18 -13
- data/test/helper.rb +21 -0
- data/test/observable_model_test.rb +2 -4
- data/test/r_widget_test.rb +5 -5
- data/test/samples/contactmanager/contact_manager_presenter_test.rb +1 -4
- data/test/samples/tictactoe/tic_tac_toe_test.rb +1 -4
- data/test/xml/glimmer_xml_test.rb +43 -43
- metadata +210 -105
- data/COPYING.LGPL +0 -504
- data/README +0 -27
- data/src/command_handlers/models/observable_model.rb +0 -35
- data/src/command_handlers/models/r_widget_listener.rb +0 -12
- data/src/parent.rb +0 -8
- data/src/swt.rb +0 -10
- data/src/xml.rb +0 -10
@@ -1,25 +1,28 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
property_type =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
@model.send(@property_name
|
20
|
-
end
|
21
|
-
def
|
22
|
-
@model.send(@property_name)
|
23
|
-
end
|
24
|
-
|
25
|
-
|
1
|
+
class ModelObserver
|
2
|
+
attr_reader :model, :property_name, :property_type
|
3
|
+
@@property_type_converters = {
|
4
|
+
:undefined => lambda { |value| value },
|
5
|
+
:fixnum => lambda { |value| value.to_i },
|
6
|
+
:array => lambda { |value| value.to_a }
|
7
|
+
}
|
8
|
+
def initialize(model, property_name, property_type = :undefined)
|
9
|
+
property_type = :undefined if property_type.nil?
|
10
|
+
@model = model
|
11
|
+
@property_name = property_name
|
12
|
+
@property_type = property_type
|
13
|
+
end
|
14
|
+
def update(value)
|
15
|
+
converted_value = @@property_type_converters[@property_type].call(value)
|
16
|
+
@model.send(@property_name + "=", converted_value) unless evaluate_property == converted_value
|
17
|
+
end
|
18
|
+
def evaluate_property
|
19
|
+
@model.send(@property_name)
|
20
|
+
end
|
21
|
+
def evaluate_options_property
|
22
|
+
@model.send(@property_name + "_options")
|
23
|
+
end
|
24
|
+
def options_property_name
|
25
|
+
self.property_name + "_options"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -1,46 +1,53 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
notify_observers_on_invokation(array, "
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
1
|
+
module ObservableArray
|
2
|
+
|
3
|
+
def add_observer(element_properties, observer)
|
4
|
+
property_observer_list << observer
|
5
|
+
each do |element|
|
6
|
+
element_properties.each do |property|
|
7
|
+
element.extend(ObservableModel) unless element.is_a?(ObservableModel)
|
8
|
+
element.add_observer(property, observer)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def property_observer_list
|
14
|
+
@property_observer_list = [] unless @property_observer_list
|
15
|
+
@property_observer_list
|
16
|
+
end
|
17
|
+
|
18
|
+
def notify_observers
|
19
|
+
property_observer_list.each {|observer| observer.update}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.extend_object(array)
|
23
|
+
array.instance_eval("alias original_add <<")
|
24
|
+
array.instance_eval <<-end_eval, __FILE__, __LINE__
|
25
|
+
def <<(value)
|
26
|
+
self.original_add(value)
|
27
|
+
notify_observers
|
28
|
+
end
|
29
|
+
end_eval
|
30
|
+
|
31
|
+
notify_observers_on_invokation(array, "delete", 1)
|
32
|
+
notify_observers_on_invokation(array, "delete_at", 1)
|
33
|
+
notify_observers_on_invokation(array, "clear")
|
34
|
+
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.notify_observers_on_invokation(model, method, argument_count=0)
|
39
|
+
model.instance_eval "alias original_#{method} #{method}\n"
|
40
|
+
arguments = ""
|
41
|
+
for index in 1..argument_count
|
42
|
+
arguments += "argument" + index.to_s + ","
|
43
|
+
end
|
44
|
+
arguments = arguments[0..-2]
|
45
|
+
model.instance_eval <<-end_eval, __FILE__, __LINE__
|
46
|
+
def #{method}(#{arguments})
|
47
|
+
self.original_#{method}(#{arguments})
|
48
|
+
notify_observers
|
49
|
+
end
|
50
|
+
end_eval
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module ObservableModel
|
2
|
+
|
3
|
+
def add_observer(property_name, observer)
|
4
|
+
property_observer_list(property_name) << observer
|
5
|
+
end
|
6
|
+
|
7
|
+
def property_observer_hash
|
8
|
+
@property_observers = Hash.new unless @property_observers
|
9
|
+
@property_observers
|
10
|
+
end
|
11
|
+
|
12
|
+
def property_observer_list(property_name)
|
13
|
+
property_observer_hash[property_name.to_sym] = [] unless property_observer_hash[property_name.to_sym]
|
14
|
+
property_observer_hash[property_name.to_sym]
|
15
|
+
end
|
16
|
+
|
17
|
+
def notify_observers(property_name)
|
18
|
+
property_observer_list(property_name).each {|observer| observer.update(send(property_name))}
|
19
|
+
end
|
20
|
+
|
21
|
+
class Updater
|
22
|
+
def initialize(property_name, observable_model)
|
23
|
+
@property_name = property_name
|
24
|
+
@observable_model = observable_model
|
25
|
+
end
|
26
|
+
def update
|
27
|
+
@observable_model.notify_observers(@property_name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.extend_object(model)
|
32
|
+
super
|
33
|
+
model.methods.each do |method|
|
34
|
+
self.add_method_observers(model, method)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.add_method_observers(model, method)
|
39
|
+
setter_method_pattern = /^(\w+=)$/
|
40
|
+
if (method.match(setter_method_pattern))
|
41
|
+
getter_method = method[0, method.length - 1]
|
42
|
+
getter_value = model.send(getter_method)
|
43
|
+
if (getter_value.is_a?(Array) and
|
44
|
+
!getter_value.is_a?(ObservableArray))
|
45
|
+
getter_value.extend(ObservableArray)
|
46
|
+
getter_value.add_observer([], Updater.new(getter_method, model))
|
47
|
+
end
|
48
|
+
model.instance_eval "alias original_#{method} #{method}\n"
|
49
|
+
model.instance_eval <<-end_eval, __FILE__, __LINE__
|
50
|
+
def #{method}(value)
|
51
|
+
self.original_#{method}(value)
|
52
|
+
notify_observers('#{getter_method}')
|
53
|
+
if (value.is_a?(Array) and !value.is_a?(ObservableArray))
|
54
|
+
value.extend(ObservableArray)
|
55
|
+
value.add_observer([], ObservableModel::Updater.new('#{getter_method}', self))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end_eval
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -1,14 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@block.call
|
13
|
-
end
|
14
|
-
end
|
1
|
+
class RRunnable
|
2
|
+
include java.lang.Runnable
|
3
|
+
|
4
|
+
def initialize(&block)
|
5
|
+
@block = block
|
6
|
+
end
|
7
|
+
|
8
|
+
def run
|
9
|
+
@block.call
|
10
|
+
end
|
11
|
+
end
|
@@ -1,27 +1,24 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
@display.dispose
|
25
|
-
end
|
26
|
-
|
1
|
+
require File.dirname(__FILE__) + "/r_widget"
|
2
|
+
|
3
|
+
class RShell < RWidget
|
4
|
+
include_package 'org.eclipse.swt.layout'
|
5
|
+
include_package 'org.eclipse.swt.widgets'
|
6
|
+
|
7
|
+
attr_reader :display
|
8
|
+
|
9
|
+
def initialize(display = Display.new)
|
10
|
+
@display = display
|
11
|
+
@widget = Shell.new(@display)
|
12
|
+
@widget.setLayout(FillLayout.new)
|
13
|
+
end
|
14
|
+
|
15
|
+
def open
|
16
|
+
@widget.pack
|
17
|
+
@widget.open
|
18
|
+
until @widget.isDisposed
|
19
|
+
@display.sleep unless @display.readAndDispatch
|
20
|
+
end
|
21
|
+
@display.dispose
|
22
|
+
end
|
23
|
+
|
27
24
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/r_widget_listener"
|
2
|
+
require File.dirname(__FILE__) + "/r_runnable"
|
3
|
+
|
4
|
+
class RTabItemComposite < RWidget
|
5
|
+
include_package 'org.eclipse.swt.widgets'
|
6
|
+
|
7
|
+
attr_reader :tab_item
|
8
|
+
def initialize(tab_item, parent, style, &contents)
|
9
|
+
super("composite", parent, style, &contents)
|
10
|
+
@tab_item = tab_item
|
11
|
+
@tab_item.widget.control = self.widget
|
12
|
+
end
|
13
|
+
|
14
|
+
def respond_to?(method_symbol, *args)
|
15
|
+
if method_symbol.to_s == "text"
|
16
|
+
true
|
17
|
+
else
|
18
|
+
super(method_symbol, *args)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def text(text_value)
|
23
|
+
@tab_item.widget.text=text_value
|
24
|
+
end
|
25
|
+
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
# Copyright (C) 2007-2008 Annas Al Maleh
|
2
|
-
# Licensed under the LGPL. See /COPYING.LGPL for more details.
|
3
|
-
|
4
1
|
require File.dirname(__FILE__) + "/r_widget_listener"
|
5
2
|
require File.dirname(__FILE__) + "/r_runnable"
|
6
3
|
|
@@ -16,6 +13,7 @@ class RWidget
|
|
16
13
|
"text" => SWT::BORDER,
|
17
14
|
"table" => SWT::BORDER,
|
18
15
|
"spinner" => SWT::BORDER,
|
16
|
+
"list" => SWT::BORDER | SWT::V_SCROLL,
|
19
17
|
"button" => SWT::PUSH,
|
20
18
|
}
|
21
19
|
|
@@ -32,7 +30,7 @@ class RWidget
|
|
32
30
|
|
33
31
|
def initialize(underscored_widget_name, parent, style, &contents)
|
34
32
|
style = default_style(underscored_widget_name) unless style
|
35
|
-
@widget = eval underscored_widget_name.to_s.camelcase
|
33
|
+
@widget = eval underscored_widget_name.to_s.camelcase + '.new(parent, style)'
|
36
34
|
@@default_initializers[underscored_widget_name].call(@widget) if @@default_initializers[underscored_widget_name]
|
37
35
|
end
|
38
36
|
|
@@ -43,11 +41,11 @@ class RWidget
|
|
43
41
|
end
|
44
42
|
|
45
43
|
def respond_to?(method_symbol, *args)
|
46
|
-
@widget.respond_to?("set
|
44
|
+
@widget.respond_to?("set#{method_symbol.to_s.camelcase(:upper)}", args)
|
47
45
|
end
|
48
46
|
|
49
47
|
def method_missing(method_symbol, *args)
|
50
|
-
statement_to_eval = "@widget.send('set' + method_symbol.to_s.camelcase(
|
48
|
+
statement_to_eval = "@widget.send('set' + method_symbol.to_s.camelcase(:upper)"
|
51
49
|
statement_to_eval << expand_arguments(args)
|
52
50
|
statement_to_eval << ")"
|
53
51
|
eval statement_to_eval
|
@@ -65,7 +63,7 @@ class RWidget
|
|
65
63
|
|
66
64
|
def self.widget_exists?(underscored_widget_name)
|
67
65
|
begin
|
68
|
-
eval underscored_widget_name.camelcase
|
66
|
+
eval underscored_widget_name.camelcase
|
69
67
|
true
|
70
68
|
rescue NameError
|
71
69
|
false
|
@@ -73,12 +71,12 @@ class RWidget
|
|
73
71
|
end
|
74
72
|
|
75
73
|
def widget_listener_exists?(underscored_listener_name)
|
76
|
-
listener_method_name = underscored_listener_name.
|
74
|
+
listener_method_name = underscored_listener_name.listener_method_name(:lower)
|
77
75
|
@widget.getClass.getMethods.each do |widget_method|
|
78
76
|
if widget_method.getName.match(/add.*Listener/)
|
79
77
|
widget_method.getParameterTypes.each do |listener_type|
|
80
78
|
listener_type.getMethods.each do |listener_method|
|
81
|
-
if (listener_method.getName
|
79
|
+
if (listener_method.getName == listener_method_name)
|
82
80
|
return true
|
83
81
|
end
|
84
82
|
end
|
@@ -89,12 +87,12 @@ class RWidget
|
|
89
87
|
end
|
90
88
|
|
91
89
|
def can_add_listener?(underscored_listener_name)
|
92
|
-
listener_method_name = underscored_listener_name.camelcase()
|
90
|
+
listener_method_name = underscored_listener_name.camelcase(:lower)
|
93
91
|
@widget.getClass.getMethods.each do |widget_method|
|
94
92
|
if widget_method.getName.match(/add.*Listener/)
|
95
93
|
widget_method.getParameterTypes.each do |listener_type|
|
96
94
|
listener_type.getMethods.each do |listener_method|
|
97
|
-
if (listener_method.getName
|
95
|
+
if (listener_method.getName == listener_method_name)
|
98
96
|
return true
|
99
97
|
end
|
100
98
|
end
|
@@ -105,14 +103,14 @@ class RWidget
|
|
105
103
|
end
|
106
104
|
|
107
105
|
def add_listener(underscored_listener_name, &block)
|
108
|
-
listener_method_name = underscored_listener_name.camelcase()
|
106
|
+
listener_method_name = underscored_listener_name.camelcase(:lower)
|
109
107
|
@widget.getClass.getMethods.each do |widget_method|
|
110
108
|
if widget_method.getName.match(/add.*Listener/)
|
111
109
|
widget_method.getParameterTypes.each do |listener_type|
|
112
110
|
listener_type.getMethods.each do |listener_method|
|
113
|
-
if (listener_method.getName
|
111
|
+
if (listener_method.getName == listener_method_name)
|
114
112
|
listener_class = Class.new(Object)
|
115
|
-
listener_class.send :include, (eval listener_type.to_s)
|
113
|
+
listener_class.send :include, (eval listener_type.to_s.sub("interface", ""))
|
116
114
|
listener = listener_class.new
|
117
115
|
listener_type.getMethods.each do |t_method|
|
118
116
|
eval "def listener.#{t_method.getName}(event) end"
|
@@ -143,4 +141,8 @@ class RWidget
|
|
143
141
|
@widget.getDisplay.syncExec(RRunnable.new(&block))
|
144
142
|
end
|
145
143
|
|
144
|
+
def has_style?(style)
|
145
|
+
(widget.style & style) == style
|
146
|
+
end
|
147
|
+
|
146
148
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
include_package 'org.eclipse.swt'
|
7
|
-
include_package 'org.eclipse.swt.layout'
|
8
|
-
include_package 'org.eclipse.swt.widgets'
|
1
|
+
# edit to add more packages and support custom widgets
|
2
|
+
class RWidget
|
3
|
+
include_package 'org.eclipse.swt'
|
4
|
+
include_package 'org.eclipse.swt.layout'
|
5
|
+
include_package 'org.eclipse.swt.widgets'
|
9
6
|
end
|
@@ -1,39 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
model_collection.
|
23
|
-
model_collection
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
1
|
+
require File.dirname(__FILE__) + "/observable_array"
|
2
|
+
require File.dirname(__FILE__) + "/observable_model"
|
3
|
+
|
4
|
+
class TableItemsUpdater
|
5
|
+
include_package 'org.eclipse.swt'
|
6
|
+
include_package 'org.eclipse.swt.widgets'
|
7
|
+
|
8
|
+
def initialize(parent, model_observer, column_properties)
|
9
|
+
@table = parent
|
10
|
+
@model_observer = model_observer
|
11
|
+
@column_properties = column_properties
|
12
|
+
update(@model_observer.evaluate_property)
|
13
|
+
model = model_observer.model
|
14
|
+
model.extend(ObservableModel) unless model.is_a?(ObservableModel)
|
15
|
+
model.add_observer(model_observer.property_name, self)
|
16
|
+
end
|
17
|
+
def update(model_collection=nil)
|
18
|
+
if (model_collection and
|
19
|
+
model_collection.is_a?(Array) and
|
20
|
+
!model_collection.is_a?(ObservableArray))
|
21
|
+
model_collection.extend(ObservableArray)
|
22
|
+
model_collection.add_observer(@column_properties, self)
|
23
|
+
@model_collection = model_collection
|
24
|
+
end
|
25
|
+
populate_table(@model_collection, @table, @column_properties)
|
26
|
+
end
|
27
|
+
def populate_table(model_collection, parent, column_properties)
|
28
|
+
parent.widget.removeAll
|
29
|
+
model_collection.each do |model|
|
30
|
+
table_item = TableItem.new(parent.widget, SWT::NONE)
|
31
|
+
for index in 0..(column_properties.size-1)
|
32
|
+
table_item.setText(index, model.send(column_properties[index]).to_s)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|