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.
Files changed (83) hide show
  1. data/.rvmrc +1 -0
  2. data/Gemfile +9 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.markdown +54 -0
  5. data/Rakefile +54 -0
  6. data/VERSION +1 -0
  7. data/bin/glimmer +132 -0
  8. data/glimmer.gemspec +145 -0
  9. data/images/Bitter-sweet.jpg +0 -0
  10. data/{src → lib}/command_handler.rb +7 -10
  11. data/{src → lib}/command_handler_chain_factory.rb +29 -22
  12. data/{src → lib}/command_handler_chain_link.rb +19 -22
  13. data/{src → lib}/command_handlers.rb +29 -26
  14. data/{src → lib}/command_handlers/bind_command_handler.rb +25 -28
  15. data/lib/command_handlers/combo_selection_data_binding_command_handler.rb +39 -0
  16. data/{src → lib}/command_handlers/data_binding_command_handler.rb +61 -64
  17. data/lib/command_handlers/list_selection_data_binding_command_handler.rb +42 -0
  18. data/lib/command_handlers/models/list_observer.rb +31 -0
  19. data/{src → lib}/command_handlers/models/model_observer.rb +28 -25
  20. data/{src → lib}/command_handlers/models/observable_array.rb +53 -46
  21. data/lib/command_handlers/models/observable_model.rb +61 -0
  22. data/{src → lib}/command_handlers/models/r_runnable.rb +11 -14
  23. data/{src → lib}/command_handlers/models/r_shell.rb +23 -26
  24. data/lib/command_handlers/models/r_tab_item_composite.rb +25 -0
  25. data/{src → lib}/command_handlers/models/r_widget.rb +16 -14
  26. data/lib/command_handlers/models/r_widget_listener.rb +9 -0
  27. data/{src → lib}/command_handlers/models/r_widget_packages.rb +5 -8
  28. data/{src → lib}/command_handlers/models/table_items_updater.rb +38 -39
  29. data/{src → lib}/command_handlers/models/widget_observer.rb +4 -6
  30. data/{src → lib}/command_handlers/shell_command_handler.rb +14 -17
  31. data/{src → lib}/command_handlers/swt_constant_command_handler.rb +18 -21
  32. data/lib/command_handlers/tab_item_command_handler.rb +22 -0
  33. data/{src → lib}/command_handlers/table_column_properties_data_binding_command_handler.rb +20 -23
  34. data/{src → lib}/command_handlers/table_items_data_binding_command_handler.rb +26 -29
  35. data/{src → lib}/command_handlers/widget_command_handler.rb +22 -25
  36. data/{src → lib}/command_handlers/widget_listener_command_handler.rb +36 -34
  37. data/{src → lib}/command_handlers/widget_method_command_handler.rb +18 -21
  38. data/{src → lib}/glimmer.rb +52 -45
  39. data/lib/parent.rb +5 -0
  40. data/{src → lib}/shine.rb +21 -24
  41. data/{src → lib}/xml_command_handlers.rb +15 -18
  42. data/{src → lib}/xml_command_handlers/html_command_handler.rb +45 -49
  43. data/{src → lib}/xml_command_handlers/models/depth_first_search_iterator.rb +17 -20
  44. data/{src → lib}/xml_command_handlers/models/name_space_visitor.rb +17 -20
  45. data/{src → lib}/xml_command_handlers/models/node.rb +80 -83
  46. data/{src → lib}/xml_command_handlers/models/node_visitor.rb +8 -11
  47. data/{src → lib}/xml_command_handlers/models/xml_visitor.rb +58 -61
  48. data/{src → lib}/xml_command_handlers/xml_command_handler.rb +18 -22
  49. data/{src → lib}/xml_command_handlers/xml_name_space_command_handler.rb +31 -34
  50. data/{src → lib}/xml_command_handlers/xml_tag_command_handler.rb +23 -26
  51. data/{src → lib}/xml_command_handlers/xml_text_command_handler.rb +19 -22
  52. data/samples/contactmanager/contact.rb +0 -3
  53. data/samples/contactmanager/contact_manager.rb +1 -4
  54. data/samples/contactmanager/contact_manager_presenter.rb +0 -3
  55. data/samples/contactmanager/contact_repository.rb +0 -3
  56. data/samples/hello_combo.rb +32 -0
  57. data/samples/hello_world.rb +1 -4
  58. data/samples/login.rb +1 -4
  59. data/samples/tictactoe/tic_tac_toe.rb +2 -5
  60. data/samples/tictactoe/tic_tac_toe_board.rb +0 -3
  61. data/test/glimmer_combo_data_binding_test.rb +131 -0
  62. data/test/glimmer_constant_test.rb +6 -11
  63. data/test/glimmer_data_binding_test.rb +16 -16
  64. data/test/glimmer_list_data_binding_test.rb +223 -0
  65. data/test/glimmer_listeners_test.rb +6 -6
  66. data/test/glimmer_shine_data_binding_test.rb +7 -6
  67. data/test/glimmer_tab_item_test.rb +61 -0
  68. data/test/glimmer_table_data_binding_test.rb +7 -20
  69. data/test/glimmer_test.rb +18 -13
  70. data/test/helper.rb +21 -0
  71. data/test/observable_model_test.rb +2 -4
  72. data/test/r_widget_test.rb +5 -5
  73. data/test/samples/contactmanager/contact_manager_presenter_test.rb +1 -4
  74. data/test/samples/tictactoe/tic_tac_toe_test.rb +1 -4
  75. data/test/xml/glimmer_xml_test.rb +43 -43
  76. metadata +210 -105
  77. data/COPYING.LGPL +0 -504
  78. data/README +0 -27
  79. data/src/command_handlers/models/observable_model.rb +0 -35
  80. data/src/command_handlers/models/r_widget_listener.rb +0 -12
  81. data/src/parent.rb +0 -8
  82. data/src/swt.rb +0 -10
  83. data/src/xml.rb +0 -10
@@ -1,23 +1,30 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/command_handler_chain_link"
5
-
6
- class CommandHandlerChainFactory
7
- @@last_chain_link = nil
8
- @@chain = nil
9
-
10
- def self.set_command_handlers(*command_handler_array)
11
- command_handler_array.each do |command_handler|
12
- puts "Loading #{command_handler.class.to_s}..."
13
- chain_link = CommandHandlerChainLink.new(command_handler)
14
- @@last_chain_link.chain_to(chain_link) if @@last_chain_link
15
- @@last_chain_link = chain_link
16
- @@chain = chain_link unless @@chain
17
- end
18
- end
19
-
20
- def self.chain
21
- @@chain
22
- end
1
+ require File.dirname(__FILE__) + "/command_handler_chain_link"
2
+
3
+ class CommandHandlerChainFactory
4
+ @@dsls = {}
5
+
6
+ def self.def_dsl(dsl, *command_handler_array)
7
+ @@last_chain_link = nil
8
+ @@chain = nil
9
+ command_handler_array.each do |command_handler|
10
+ puts "Loading #{command_handler.class.to_s}..."
11
+ chain_link = CommandHandlerChainLink.new(command_handler)
12
+ @@last_chain_link.chain_to(chain_link) if @@last_chain_link
13
+ @@last_chain_link = chain_link
14
+ @@chain = chain_link unless @@chain
15
+ end
16
+ @@dsls[dsl] = {
17
+ :last_chain_link => @@last_chain_link,
18
+ :chain => @@chain
19
+ }
20
+ end
21
+
22
+ def self.select_dsl(dsl)
23
+ @@last_chain_link = @@dsls[dsl][:last_chain_link]
24
+ @@chain = @@dsls[dsl][:chain]
25
+ end
26
+
27
+ def self.chain
28
+ @@chain
29
+ end
23
30
  end
@@ -1,22 +1,19 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- class CommandHandlerChainLink
5
- def initialize(command_handler)
6
- @command_handler = command_handler
7
- end
8
- def chain_to(next_chain_link)
9
- @next_chain_link = next_chain_link
10
- end
11
- def handle(parent, command_symbol, *args, &block)
12
- if (@command_handler.can_handle?(parent, command_symbol, *args, &block))
13
- puts "#{@command_handler.class.to_s} will handle command: #{command_symbol} with arguments #{args}"
14
- return @command_handler.do_handle(parent, command_symbol, *args, &block)
15
- elsif @next_chain_link
16
- return @next_chain_link.handle(parent, command_symbol, *args, &block)
17
- else
18
- puts "Command: #{command_symbol} cannot be handled!"
19
- return nil
20
- end
21
- end
22
- end
1
+ class CommandHandlerChainLink
2
+ def initialize(command_handler)
3
+ @command_handler = command_handler
4
+ end
5
+ def chain_to(next_chain_link)
6
+ @next_chain_link = next_chain_link
7
+ end
8
+ def handle(parent, command_symbol, *args, &block)
9
+ if (@command_handler.can_handle?(parent, command_symbol, *args, &block))
10
+ puts "#{@command_handler.class.to_s} will handle command: #{command_symbol} with arguments #{args}"
11
+ return @command_handler.do_handle(parent, command_symbol, *args, &block)
12
+ elsif @next_chain_link
13
+ return @next_chain_link.handle(parent, command_symbol, *args, &block)
14
+ else
15
+ puts "Command: #{command_symbol} cannot be handled!"
16
+ return nil
17
+ end
18
+ end
19
+ end
@@ -1,26 +1,29 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/command_handler_chain_factory"
5
- require File.dirname(__FILE__) + "/command_handlers/shell_command_handler"
6
- require File.dirname(__FILE__) + "/command_handlers/widget_listener_command_handler"
7
- require File.dirname(__FILE__) + "/command_handlers/bind_command_handler"
8
- require File.dirname(__FILE__) + "/command_handlers/table_items_data_binding_command_handler"
9
- require File.dirname(__FILE__) + "/command_handlers/table_column_properties_data_binding_command_handler"
10
- require File.dirname(__FILE__) + "/command_handlers/data_binding_command_handler"
11
- require File.dirname(__FILE__) + "/command_handlers/widget_method_command_handler"
12
- require File.dirname(__FILE__) + "/command_handlers/widget_command_handler"
13
- require File.dirname(__FILE__) + "/command_handlers/swt_constant_command_handler"
14
-
15
- # edit to add more command handlers and extend Glimmer
16
- CommandHandlerChainFactory.set_command_handlers(
17
- ShellCommandHandler.new,
18
- WidgetListenerCommandHandler.new,
19
- BindCommandHandler.new,
20
- TableItemsDataBindingCommandHandler.new,
21
- TableColumnPropertiesDataBindingCommandHandler.new,
22
- DataBindingCommandHandler.new,
23
- WidgetMethodCommandHandler.new,
24
- WidgetCommandHandler.new,
25
- SwtConstantCommandHandler.new #at the bottom to avoid stealing commands from other command handlers
26
- )
1
+ require File.dirname(__FILE__) + "/command_handler_chain_factory"
2
+ require File.dirname(__FILE__) + "/command_handlers/shell_command_handler"
3
+ require File.dirname(__FILE__) + "/command_handlers/widget_listener_command_handler"
4
+ require File.dirname(__FILE__) + "/command_handlers/bind_command_handler"
5
+ require File.dirname(__FILE__) + "/command_handlers/tab_item_command_handler"
6
+ require File.dirname(__FILE__) + "/command_handlers/combo_selection_data_binding_command_handler"
7
+ require File.dirname(__FILE__) + "/command_handlers/list_selection_data_binding_command_handler"
8
+ require File.dirname(__FILE__) + "/command_handlers/table_items_data_binding_command_handler"
9
+ require File.dirname(__FILE__) + "/command_handlers/table_column_properties_data_binding_command_handler"
10
+ require File.dirname(__FILE__) + "/command_handlers/data_binding_command_handler"
11
+ require File.dirname(__FILE__) + "/command_handlers/widget_method_command_handler"
12
+ require File.dirname(__FILE__) + "/command_handlers/widget_command_handler"
13
+ require File.dirname(__FILE__) + "/command_handlers/swt_constant_command_handler"
14
+
15
+ # edit to add more command handlers and extend Glimmer
16
+ CommandHandlerChainFactory.def_dsl(:swt,
17
+ ShellCommandHandler.new,
18
+ WidgetListenerCommandHandler.new,
19
+ BindCommandHandler.new,
20
+ TabItemCommandHandler.new,
21
+ ComboSelectionDataBindingCommandHandler.new,
22
+ ListSelectionDataBindingCommandHandler.new,
23
+ TableItemsDataBindingCommandHandler.new,
24
+ TableColumnPropertiesDataBindingCommandHandler.new,
25
+ DataBindingCommandHandler.new,
26
+ WidgetMethodCommandHandler.new,
27
+ WidgetCommandHandler.new,
28
+ SwtConstantCommandHandler.new #at the bottom to avoid stealing commands from other command handlers
29
+ )
@@ -1,29 +1,26 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/../command_handler"
5
- require File.dirname(__FILE__) + "/models/r_widget"
6
- require File.dirname(__FILE__) + "/models/model_observer"
7
-
8
- class BindCommandHandler
9
- include CommandHandler
10
-
11
- include_package 'org.eclipse.swt.widgets'
12
-
13
- def can_handle?(parent, command_symbol, *args, &block)
14
- parent.is_a?(RWidget) and
15
- command_symbol.to_s == "bind" and
16
- (((args.size == 2) and
17
- (args[1].is_a?(Symbol) or args[1].is_a?(String))) or
18
- ((args.size == 3) and
19
- (args[1].is_a?(Symbol) or args[1].is_a?(String)) and
20
- (args[2].is_a?(Symbol) or args[2].is_a?(String)))) and
21
- block == nil
22
- end
23
-
24
- def do_handle(parent, command_symbol, *args, &block)
25
- property_type = args[2] if (args.size == 3)
26
- ModelObserver.new(args[0], args[1].to_s, property_type)
27
- end
28
-
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/model_observer"
4
+
5
+ class BindCommandHandler
6
+ include CommandHandler
7
+
8
+ include_package 'org.eclipse.swt.widgets'
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ parent.is_a?(RWidget) and
12
+ command_symbol.to_s == "bind" and
13
+ (((args.size == 2) and
14
+ (args[1].is_a?(Symbol) or args[1].is_a?(String))) or
15
+ ((args.size == 3) and
16
+ (args[1].is_a?(Symbol) or args[1].is_a?(String)) and
17
+ (args[2].is_a?(Symbol) or args[2].is_a?(String)))) and
18
+ block == nil
19
+ end
20
+
21
+ def do_handle(parent, command_symbol, *args, &block)
22
+ property_type = args[2] if (args.size == 3)
23
+ ModelObserver.new(args[0], args[1].to_s, property_type)
24
+ end
25
+
29
26
  end
@@ -0,0 +1,39 @@
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+
4
+ class ComboSelectionDataBindingCommandHandler
5
+ include CommandHandler
6
+ include Glimmer
7
+
8
+ include_package 'org.eclipse.swt.widgets'
9
+
10
+ def can_handle?(parent, command_symbol, *args, &block)
11
+ parent.is_a?(RWidget) and
12
+ parent.widget.is_a?(Combo) and
13
+ command_symbol.to_s == "selection" and
14
+ args.size == 1 and
15
+ args[0].is_a?(ModelObserver) and
16
+ args[0].evaluate_options_property.is_a?(Array) and
17
+ block == nil
18
+ end
19
+
20
+ def do_handle(parent, command_symbol, *args, &block)
21
+ model_observer = args[0]
22
+ widget_observer = WidgetObserver.new(parent, "items")
23
+ widget_observer.update(model_observer.evaluate_options_property)
24
+ model = model_observer.model
25
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
26
+ model.add_observer(model_observer.options_property_name, widget_observer)
27
+
28
+ widget_observer = WidgetObserver.new(parent, "text")
29
+ widget_observer.update(model_observer.evaluate_property)
30
+ model.add_observer(model_observer.property_name, widget_observer)
31
+
32
+ add_contents(parent) {
33
+ on_widget_selected {
34
+ model_observer.update(widget_observer.evaluate_property)
35
+ }
36
+ }
37
+ end
38
+
39
+ end
@@ -1,64 +1,61 @@
1
- # Copyright (C) 2007-2008 Annas Al Maleh
2
- # Licensed under the LGPL. See /COPYING.LGPL for more details.
3
-
4
- require File.dirname(__FILE__) + "/../command_handler"
5
- require File.dirname(__FILE__) + "/models/r_widget"
6
- require File.dirname(__FILE__) + "/models/observable_model"
7
- require File.dirname(__FILE__) + "/models/model_observer"
8
- require File.dirname(__FILE__) + "/models/widget_observer"
9
-
10
- class DataBindingCommandHandler
11
- extend Glimmer
12
- include CommandHandler
13
-
14
- include_package 'org.eclipse.swt.widgets'
15
-
16
- @@widget_data_binders = {
17
- Java::OrgEclipseSwtWidgets::Text => {
18
- :text => Proc.new do |rwidget, model_observer|
19
- add_contents(rwidget) {
20
- on_modify_text { |modify_event|
21
- model_observer.update(rwidget.widget.getText)
22
- }
23
- }
24
- end,
25
- },
26
- Java::OrgEclipseSwtWidgets::Button => {
27
- :selection => Proc.new do |rwidget, model_observer|
28
- add_contents(rwidget) {
29
- on_widget_selected { |selection_event|
30
- model_observer.update(rwidget.widget.getSelection)
31
- }
32
- }
33
- end
34
- },
35
- Java::OrgEclipseSwtWidgets::Spinner => {
36
- :selection => Proc.new do |rwidget, model_observer|
37
- add_contents(rwidget) {
38
- on_widget_selected { |selection_event|
39
- model_observer.update(rwidget.widget.getSelection)
40
- }
41
- }
42
- end
43
- }
44
- }
45
-
46
- def can_handle?(parent, command_symbol, *args, &block)
47
- parent.is_a?(RWidget) and
48
- args.size == 1 and
49
- args[0].is_a?(ModelObserver)
50
- end
51
-
52
- def do_handle(parent, command_symbol, *args, &block)
53
- model_observer = args[0]
54
- widget_observer = WidgetObserver.new(parent, command_symbol.to_s)
55
- widget_observer.update(model_observer.evaluate_property)
56
- model = model_observer.model
57
- model.extend ObservableModel unless model.is_a?(ObservableModel)
58
- model.add_observer(model_observer.property_name, widget_observer)
59
- widget_data_binder_map = @@widget_data_binders[parent.widget.class]
60
- widget_data_binder = widget_data_binder_map[command_symbol.to_s.to_sym] if widget_data_binder_map
61
- widget_data_binder.call(parent, model_observer) if widget_data_binder
62
- end
63
-
64
- end
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/observable_model"
4
+ require File.dirname(__FILE__) + "/models/model_observer"
5
+ require File.dirname(__FILE__) + "/models/widget_observer"
6
+
7
+ class DataBindingCommandHandler
8
+ extend Glimmer
9
+ include CommandHandler
10
+
11
+ include_package 'org.eclipse.swt.widgets'
12
+
13
+ @@widget_data_binders = {
14
+ Java::OrgEclipseSwtWidgets::Text => {
15
+ :text => Proc.new do |rwidget, model_observer|
16
+ add_contents(rwidget) {
17
+ on_modify_text { |modify_event|
18
+ model_observer.update(rwidget.widget.getText)
19
+ }
20
+ }
21
+ end,
22
+ },
23
+ Java::OrgEclipseSwtWidgets::Button => {
24
+ :selection => Proc.new do |rwidget, model_observer|
25
+ add_contents(rwidget) {
26
+ on_widget_selected { |selection_event|
27
+ model_observer.update(rwidget.widget.getSelection)
28
+ }
29
+ }
30
+ end
31
+ },
32
+ Java::OrgEclipseSwtWidgets::Spinner => {
33
+ :selection => Proc.new do |rwidget, model_observer|
34
+ add_contents(rwidget) {
35
+ on_widget_selected { |selection_event|
36
+ model_observer.update(rwidget.widget.getSelection)
37
+ }
38
+ }
39
+ end
40
+ }
41
+ }
42
+
43
+ def can_handle?(parent, command_symbol, *args, &block)
44
+ parent.is_a?(RWidget) and
45
+ args.size == 1 and
46
+ args[0].is_a?(ModelObserver)
47
+ end
48
+
49
+ def do_handle(parent, command_symbol, *args, &block)
50
+ model_observer = args[0]
51
+ widget_observer = WidgetObserver.new(parent, command_symbol.to_s)
52
+ widget_observer.update(model_observer.evaluate_property)
53
+ model = model_observer.model
54
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
55
+ model.add_observer(model_observer.property_name, widget_observer)
56
+ widget_data_binder_map = @@widget_data_binders[parent.widget.class]
57
+ widget_data_binder = widget_data_binder_map[command_symbol.to_s.to_sym] if widget_data_binder_map
58
+ widget_data_binder.call(parent, model_observer) if widget_data_binder
59
+ end
60
+
61
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + "/../command_handler"
2
+ require File.dirname(__FILE__) + "/models/r_widget"
3
+ require File.dirname(__FILE__) + "/models/list_observer"
4
+
5
+ class ListSelectionDataBindingCommandHandler
6
+ include CommandHandler
7
+ include Glimmer
8
+
9
+ include_package 'org.eclipse.swt.widgets'
10
+
11
+ def can_handle?(parent, command_symbol, *args, &block)
12
+ parent.is_a?(RWidget) and
13
+ parent.widget.is_a?(List) and
14
+ command_symbol.to_s == "selection" and
15
+ args.size == 1 and
16
+ args[0].is_a?(ModelObserver) and
17
+ args[0].evaluate_options_property.is_a?(Array) and
18
+ block == nil
19
+ end
20
+
21
+ def do_handle(parent, command_symbol, *args, &block)
22
+ model_observer = args[0]
23
+ widget_observer = WidgetObserver.new(parent, "items")
24
+ widget_observer.update(model_observer.evaluate_options_property)
25
+ model = model_observer.model
26
+ model.extend ObservableModel unless model.is_a?(ObservableModel)
27
+ model.add_observer(model_observer.options_property_name, widget_observer)
28
+
29
+ property_type = :string
30
+ property_type = :array if parent.has_style?(multi)
31
+ list_observer = ListObserver.new(parent, property_type)
32
+ list_observer.update(model_observer.evaluate_property)
33
+ model.add_observer(model_observer.property_name, list_observer)
34
+
35
+ add_contents(parent) {
36
+ on_widget_selected {
37
+ model_observer.update(list_observer.evaluate_property)
38
+ }
39
+ }
40
+ end
41
+
42
+ end
@@ -0,0 +1,31 @@
1
+ class ListObserver
2
+ attr_reader :widget
3
+ @@property_type_updaters = {
4
+ :string => lambda { |widget, value| widget.widget.select(widget.widget.index_of(value.to_s)) },
5
+ :array => lambda { |widget, value| widget.widget.selection=((value or []).to_java :string) }
6
+ }
7
+ @@property_evaluators = {
8
+ :string => lambda do |selection_array|
9
+ return nil if selection_array.empty?
10
+ selection_array[0]
11
+ end,
12
+ :array => lambda do |selection_array|
13
+ selection_array
14
+ end
15
+ }
16
+ def initialize(widget, property_type)
17
+ property_type = :string if property_type.nil? or property_type == :undefined
18
+ @widget = widget
19
+ @property_type = property_type
20
+ end
21
+ def update(value)
22
+ raise "hell" if value == ["Canada"]
23
+ @@property_type_updaters[@property_type].call(@widget, value) unless evaluate_property == value
24
+ end
25
+ def evaluate_property
26
+ selection_array = @widget.widget.send("selection").to_a
27
+ property_value = @@property_evaluators[@property_type].call(selection_array)
28
+ return property_value
29
+ end
30
+ end
31
+