glimmer 0.3.5 → 0.4.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +94 -32
  3. data/lib/glimmer.rb +4 -6
  4. data/lib/glimmer/command_handler.rb +10 -0
  5. data/lib/glimmer/command_handler_chain_factory.rb +32 -0
  6. data/lib/glimmer/command_handler_chain_link.rb +21 -0
  7. data/lib/{command_handlers.rb → glimmer/command_handlers.rb} +21 -17
  8. data/lib/glimmer/command_handlers/bind_command_handler.rb +51 -0
  9. data/lib/glimmer/command_handlers/color_command_handler.rb +26 -0
  10. data/lib/glimmer/command_handlers/combo_selection_data_binding_command_handler.rb +40 -0
  11. data/lib/glimmer/command_handlers/data_binding_command_handler.rb +69 -0
  12. data/lib/glimmer/command_handlers/display_command_handler.rb +16 -0
  13. data/lib/glimmer/command_handlers/list_selection_data_binding_command_handler.rb +45 -0
  14. data/lib/glimmer/command_handlers/models/g_color.rb +34 -0
  15. data/lib/glimmer/command_handlers/models/g_display.rb +26 -0
  16. data/lib/glimmer/command_handlers/models/g_font.rb +62 -0
  17. data/lib/glimmer/command_handlers/models/g_runnable.rb +13 -0
  18. data/lib/glimmer/command_handlers/models/g_shell.rb +27 -0
  19. data/lib/glimmer/command_handlers/models/g_swt.rb +22 -0
  20. data/lib/glimmer/command_handlers/models/g_tab_item_composite.rb +33 -0
  21. data/lib/glimmer/command_handlers/models/g_widget.rb +199 -0
  22. data/lib/glimmer/command_handlers/models/g_widget_listener.rb +11 -0
  23. data/lib/glimmer/command_handlers/models/list_selection_binding.rb +47 -0
  24. data/lib/glimmer/command_handlers/models/model_binding.rb +206 -0
  25. data/lib/glimmer/command_handlers/models/observable.rb +11 -0
  26. data/lib/glimmer/command_handlers/models/observable_array.rb +104 -0
  27. data/lib/glimmer/command_handlers/models/observable_model.rb +105 -0
  28. data/lib/glimmer/command_handlers/models/observer.rb +115 -0
  29. data/lib/glimmer/command_handlers/models/table_items_binding.rb +45 -0
  30. data/lib/glimmer/command_handlers/models/tree_items_binding.rb +49 -0
  31. data/lib/glimmer/command_handlers/models/widget_binding.rb +29 -0
  32. data/lib/glimmer/command_handlers/shell_command_handler.rb +17 -0
  33. data/lib/glimmer/command_handlers/tab_item_command_handler.rb +21 -0
  34. data/lib/glimmer/command_handlers/table_column_properties_data_binding_command_handler.rb +25 -0
  35. data/lib/glimmer/command_handlers/table_items_data_binding_command_handler.rb +30 -0
  36. data/lib/glimmer/command_handlers/tree_items_data_binding_command_handler.rb +29 -0
  37. data/lib/glimmer/command_handlers/tree_properties_data_binding_command_handler.rb +25 -0
  38. data/lib/glimmer/command_handlers/widget_command_handler.rb +22 -0
  39. data/lib/glimmer/command_handlers/widget_listener_command_handler.rb +39 -0
  40. data/lib/glimmer/command_handlers/widget_method_command_handler.rb +21 -0
  41. data/lib/glimmer/parent.rb +7 -0
  42. data/lib/{shine.rb → glimmer/shine.rb} +1 -1
  43. data/lib/glimmer/swt_packages.rb +13 -0
  44. data/lib/{xml_command_handlers.rb → glimmer/xml_command_handlers.rb} +10 -8
  45. data/lib/glimmer/xml_command_handlers/html_command_handler.rb +47 -0
  46. data/lib/glimmer/xml_command_handlers/models/depth_first_search_iterator.rb +19 -0
  47. data/lib/glimmer/xml_command_handlers/models/name_space_visitor.rb +20 -0
  48. data/lib/glimmer/xml_command_handlers/models/node.rb +82 -0
  49. data/lib/glimmer/xml_command_handlers/models/node_visitor.rb +11 -0
  50. data/lib/glimmer/xml_command_handlers/models/xml_visitor.rb +61 -0
  51. data/lib/glimmer/xml_command_handlers/xml_command_handler.rb +20 -0
  52. data/lib/glimmer/xml_command_handlers/xml_name_space_command_handler.rb +33 -0
  53. data/lib/glimmer/xml_command_handlers/xml_tag_command_handler.rb +25 -0
  54. data/lib/glimmer/xml_command_handlers/xml_text_command_handler.rb +21 -0
  55. metadata +53 -54
  56. data/lib/command_handler.rb +0 -8
  57. data/lib/command_handler_chain_factory.rb +0 -30
  58. data/lib/command_handler_chain_link.rb +0 -19
  59. data/lib/command_handlers/bind_command_handler.rb +0 -49
  60. data/lib/command_handlers/color_command_handler.rb +0 -24
  61. data/lib/command_handlers/combo_selection_data_binding_command_handler.rb +0 -38
  62. data/lib/command_handlers/data_binding_command_handler.rb +0 -67
  63. data/lib/command_handlers/list_selection_data_binding_command_handler.rb +0 -43
  64. data/lib/command_handlers/models/block_observer.rb +0 -14
  65. data/lib/command_handlers/models/list_selection_binding.rb +0 -45
  66. data/lib/command_handlers/models/model_binding.rb +0 -205
  67. data/lib/command_handlers/models/observable.rb +0 -9
  68. data/lib/command_handlers/models/observable_array.rb +0 -102
  69. data/lib/command_handlers/models/observable_model.rb +0 -103
  70. data/lib/command_handlers/models/observer.rb +0 -88
  71. data/lib/command_handlers/models/r_color.rb +0 -32
  72. data/lib/command_handlers/models/r_font.rb +0 -60
  73. data/lib/command_handlers/models/r_runnable.rb +0 -11
  74. data/lib/command_handlers/models/r_shell.rb +0 -24
  75. data/lib/command_handlers/models/r_swt.rb +0 -18
  76. data/lib/command_handlers/models/r_tab_item_composite.rb +0 -31
  77. data/lib/command_handlers/models/r_widget.rb +0 -183
  78. data/lib/command_handlers/models/r_widget_listener.rb +0 -9
  79. data/lib/command_handlers/models/table_items_binding.rb +0 -43
  80. data/lib/command_handlers/models/tree_items_binding.rb +0 -47
  81. data/lib/command_handlers/models/widget_binding.rb +0 -27
  82. data/lib/command_handlers/shell_command_handler.rb +0 -15
  83. data/lib/command_handlers/tab_item_command_handler.rb +0 -19
  84. data/lib/command_handlers/table_column_properties_data_binding_command_handler.rb +0 -23
  85. data/lib/command_handlers/table_items_data_binding_command_handler.rb +0 -28
  86. data/lib/command_handlers/tree_items_data_binding_command_handler.rb +0 -27
  87. data/lib/command_handlers/tree_properties_data_binding_command_handler.rb +0 -23
  88. data/lib/command_handlers/widget_command_handler.rb +0 -20
  89. data/lib/command_handlers/widget_listener_command_handler.rb +0 -37
  90. data/lib/command_handlers/widget_method_command_handler.rb +0 -19
  91. data/lib/parent.rb +0 -5
  92. data/lib/string.rb +0 -8
  93. data/lib/swt_packages.rb +0 -11
  94. data/lib/symbol.rb +0 -10
  95. data/lib/xml_command_handlers/html_command_handler.rb +0 -45
  96. data/lib/xml_command_handlers/models/depth_first_search_iterator.rb +0 -17
  97. data/lib/xml_command_handlers/models/name_space_visitor.rb +0 -18
  98. data/lib/xml_command_handlers/models/node.rb +0 -80
  99. data/lib/xml_command_handlers/models/node_visitor.rb +0 -9
  100. data/lib/xml_command_handlers/models/xml_visitor.rb +0 -59
  101. data/lib/xml_command_handlers/xml_command_handler.rb +0 -18
  102. data/lib/xml_command_handlers/xml_name_space_command_handler.rb +0 -31
  103. data/lib/xml_command_handlers/xml_tag_command_handler.rb +0 -23
  104. data/lib/xml_command_handlers/xml_text_command_handler.rb +0 -19
@@ -1,9 +0,0 @@
1
- module Observable
2
- def add_observer(observer, property_or_properties=nil)
3
- raise 'Not implemented!'
4
- end
5
-
6
- def remove_observer(observer, property_or_properties=nil)
7
- raise 'Not implemented!'
8
- end
9
- end
@@ -1,102 +0,0 @@
1
- require 'set'
2
-
3
- require_relative 'observable'
4
-
5
- # TODO prefix utility methods with double-underscore
6
- module ObservableArray
7
- include Observable
8
-
9
- def add_observer(observer, element_properties=nil)
10
- return observer if has_observer?(observer) && element_properties.nil?
11
- property_observer_list << observer
12
- [element_properties].flatten.compact.each do |property|
13
- each do |element|
14
- observer.observe(element, property)
15
- end
16
- end
17
- observer
18
- end
19
-
20
- def remove_observer(observer, element_properties=nil)
21
- property_observer_list.delete(observer)
22
- [element_properties].flatten.compact.each do |property|
23
- each do |element|
24
- observer.unobserve(element, property)
25
- end
26
- end
27
- observer
28
- end
29
-
30
- def has_observer?(observer)
31
- property_observer_list.include?(observer)
32
- end
33
-
34
- def property_observer_list
35
- @property_observer_list ||= Set.new
36
- end
37
-
38
- def notify_observers
39
- property_observer_list.each {|observer| observer.update}
40
- end
41
-
42
- def self.extend_object(array)
43
- array.instance_eval("alias __original_add <<")
44
- array.instance_eval <<-end_eval, __FILE__, __LINE__
45
- def <<(value)
46
- self.__original_add(value)
47
- notify_observers
48
- end
49
- end_eval
50
-
51
- array.instance_eval("alias __original_set_value []=")
52
- array.instance_eval <<-end_eval, __FILE__, __LINE__
53
- def []=(index, value)
54
- old_value = self[index]
55
- unregister_dependent_observers(old_value)
56
- self.__original_set_value(index, value)
57
- notify_observers
58
- end
59
- end_eval
60
-
61
- array.instance_eval("alias __original_delete delete")
62
- array.instance_eval <<-end_eval, __FILE__, __LINE__
63
- def delete(value)
64
- unregister_dependent_observers(value)
65
- self.__original_delete(value)
66
- notify_observers
67
- end
68
- end_eval
69
-
70
- array.instance_eval("alias __original_delete_at delete_at")
71
- array.instance_eval <<-end_eval, __FILE__, __LINE__
72
- def delete_at(index)
73
- old_value = self[index]
74
- unregister_dependent_observers(old_value)
75
- self.__original_delete_at(index)
76
- notify_observers
77
- end
78
- end_eval
79
-
80
- array.instance_eval("alias __original_clear clear")
81
- array.instance_eval <<-end_eval, __FILE__, __LINE__
82
- def clear
83
- each do |old_value|
84
- unregister_dependent_observers(old_value)
85
- end
86
- self.__original_clear
87
- notify_observers
88
- end
89
- end_eval
90
-
91
- super
92
- end
93
-
94
- def unregister_dependent_observers(old_value)
95
- # TODO look into optimizing this
96
- return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
97
- property_observer_list.each do |observer|
98
- observer.unregister_dependents_with_observable([self, nil], old_value)
99
- end
100
- end
101
-
102
- end
@@ -1,103 +0,0 @@
1
- require 'set'
2
-
3
- require_relative 'observable'
4
- require_relative 'observer'
5
-
6
- # TODO prefix utility methods with double-underscore
7
- module ObservableModel
8
- include Observable
9
-
10
- class Updater
11
- include Observer
12
- def initialize(observable_model, property_name)
13
- @observable_model = observable_model
14
- @property_name = property_name
15
- end
16
- def update(changed_value=nil)
17
- @observable_model.notify_observers(@property_name)
18
- end
19
- end
20
-
21
- def add_observer(observer, property_name)
22
- return observer if has_observer?(observer, property_name)
23
- property_observer_list(property_name) << observer
24
- add_property_writer_observers(property_name)
25
- observer
26
- end
27
-
28
- def remove_observer(observer, property_name)
29
- property_observer_list(property_name).delete(observer)
30
- end
31
-
32
- def has_observer?(observer, property_name)
33
- property_observer_list(property_name).include?(observer)
34
- end
35
-
36
- def has_observer_for_any_property?(observer)
37
- property_observer_hash.values.map(&:to_a).sum.include?(observer)
38
- end
39
-
40
- def property_observer_hash
41
- @property_observers = Hash.new unless @property_observers
42
- @property_observers
43
- end
44
-
45
- def property_observer_list(property_name)
46
- property_observer_hash[property_name.to_sym] = Set.new unless property_observer_hash[property_name.to_sym]
47
- property_observer_hash[property_name.to_sym]
48
- end
49
-
50
- def notify_observers(property_name)
51
- property_observer_list(property_name).each {|observer| observer.update(send(property_name))}
52
- end
53
- #TODO upon updating values, make sure dependent observers are cleared (not added as dependents here)
54
-
55
- def add_property_writer_observers(property_name)
56
- property_writer_name = "#{property_name}="
57
- method(property_writer_name)
58
- ensure_array_object_observer(property_name, send(property_name))
59
- begin
60
- method("__original_#{property_writer_name}")
61
- rescue
62
- instance_eval "alias __original_#{property_writer_name} #{property_writer_name}"
63
- instance_eval <<-end_eval, __FILE__, __LINE__
64
- def #{property_writer_name}(value)
65
- old_value = self.#{property_name}
66
- unregister_dependent_observers('#{property_name}', old_value)
67
- self.__original_#{property_writer_name}(value)
68
- notify_observers('#{property_name}')
69
- ensure_array_object_observer('#{property_name}', value, old_value)
70
- end
71
- end_eval
72
- end
73
- rescue => e
74
- # ignore writing if no property writer exists
75
- Glimmer.logger.debug "No need to observe property writer: #{property_writer_name}\n#{e.message}\n#{e.backtrace.join("\n")}"
76
- end
77
-
78
- def unregister_dependent_observers(property_name, old_value)
79
- # TODO look into optimizing this
80
- return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
81
- property_observer_list(property_name).each do |observer|
82
- observer.unregister_dependents_with_observable([self, property_name], old_value)
83
- end
84
- end
85
-
86
- def ensure_array_object_observer(property_name, object, old_object = nil)
87
- return unless object.is_a?(Array)
88
- array_object_observer = array_object_observer_for(property_name)
89
- array_object_observer.observe(object)
90
- property_observer_list(property_name).each do |observer|
91
- observer.add_dependent([self, property_name] => [array_object_observer, object, nil])
92
- end
93
- array_object_observer_for(property_name).unregister(old_object) if old_object.is_a?(ObservableArray)
94
- end
95
-
96
- def array_object_observer_for(property_name)
97
- @array_object_observers ||= {}
98
- unless @array_object_observers.has_key?(property_name)
99
- @array_object_observers[property_name] = ObservableModel::Updater.new(self, property_name)
100
- end
101
- @array_object_observers[property_name]
102
- end
103
- end
@@ -1,88 +0,0 @@
1
- require 'set'
2
-
3
- # Mixin representing Observer trait from Observer Design Pattern
4
- # Allows classes to include without interfering with their
5
- # inheritance hierarchy.
6
- module Observer
7
- def registrations
8
- @registrations ||= Set.new
9
- end
10
-
11
- def registrations_for(observable, property = nil)
12
- registrations.select {|o, p| o == observable && p == property}
13
- end
14
-
15
- # mapping of registrations to dependents
16
- # {[observable, property] => [[dependent, dependent_observable, dependent_property], ...]}
17
- def dependents
18
- @dependents ||= Hash.new
19
- end
20
-
21
- def dependents_for(registration)
22
- dependents[registration] ||= Set.new
23
- end
24
-
25
- # registers observer in an observable on a property (optional)
26
- # observer maintains registration list to unregister later
27
- def register(observable, property = nil)
28
- unless observable.is_a?(Observable)
29
- # TODO refactor code to be more smart/polymorphic/automated and honor open/closed principle
30
- if observable.is_a?(Array)
31
- observable.extend(ObservableArray)
32
- else
33
- observable.extend(ObservableModel)
34
- end
35
- end
36
- observable.add_observer(*[self, property].compact)
37
- [observable, property].tap do |registration|
38
- self.registrations << registration
39
- end
40
- end
41
- alias observe register
42
-
43
- def unregister(observable, property = nil)
44
- observable.remove_observer(*[self, property].compact)
45
- registration = [observable, property]
46
- dependents_for(registration).each do |dependent|
47
- dependent_observer, dependent_observable, dependent_property = dependent
48
- dependent_observer.unregister(dependent_observable, dependent_property)
49
- remove_dependent(registration => dependent)
50
- end
51
- registrations.delete(registration)
52
- end
53
- alias unobserve unregister
54
-
55
- def unregister_dependents_with_observable(registration, dependent_observable)
56
- thedependents = dependents_for(registration).select do |d_observer, d_observable, d_property|
57
- d_observable == dependent_observable
58
- end
59
- thedependents.each do |d_observer, d_observable, d_property|
60
- d_observer.unregister(d_observable, d_property)
61
- end
62
- end
63
-
64
- # cleans up all registrations in observables
65
- def unregister_all_observables
66
- registrations.each do |observable, property|
67
- unregister(observable, property)
68
- end
69
- end
70
- alias unobserve_all_observables unregister_all_observables
71
-
72
- # add dependent observer to unregister when unregistering observer
73
- def add_dependent(parent_to_dependent_hash)
74
- observable, property = registration = parent_to_dependent_hash.keys.first
75
- dependent_observer, dependent_observable, dependent_property = dependent = parent_to_dependent_hash.values.first
76
- dependents_for(registration) << dependent
77
- end
78
-
79
- def remove_dependent(parent_to_dependent_hash)
80
- observable, property = registration = parent_to_dependent_hash.keys.first
81
- dependent_observer, dependent_observable, dependent_property = dependent = parent_to_dependent_hash.values.first
82
- dependents_for(registration).delete(dependent)
83
- end
84
-
85
- def update(changed_value)
86
- raise 'Not implemented!'
87
- end
88
- end
@@ -1,32 +0,0 @@
1
- require_relative 'r_swt'
2
-
3
- class RColor
4
- attr_reader :display, :red, :green, :blue, :alpha
5
-
6
- include_package 'org.eclipse.swt.graphics'
7
-
8
- class << self
9
- include_package 'org.eclipse.swt'
10
-
11
- def for(display, standard_color)
12
- display.getSystemColor(RSwt[standard_color])
13
- end
14
- end
15
-
16
- def initialize(display, red, green, blue, alpha = nil)
17
- @display = display
18
- @red = red
19
- @green = green
20
- @blue = blue
21
- @alpha = alpha
22
- end
23
-
24
- def color
25
- @color ||= Color.new(@display, *[@red, @green, @blue, @alpha].compact)
26
- end
27
-
28
- def display=(a_display)
29
- @display = a_display
30
- @color = nil
31
- end
32
- end
@@ -1,60 +0,0 @@
1
- require_relative 'r_swt'
2
-
3
- class RFont
4
- include_package 'org.eclipse.swt.graphics'
5
-
6
- extend Glimmer
7
-
8
- attr_reader :r_widget
9
- attr_accessor :display
10
-
11
- class << self
12
- def for(r_widget)
13
- @instances ||= {}
14
- unless @instances[r_widget]
15
- @instances[r_widget] = new(r_widget)
16
- add_contents(r_widget) {
17
- on_widget_disposed { |dispose_event|
18
- @instances.delete(r_widget)
19
- }
20
- }
21
- end
22
- @instances[r_widget]
23
- end
24
- end
25
-
26
- def initialize(r_widget, display = nil)
27
- @r_widget = r_widget
28
- @display = display || @r_widget.widget.display
29
- end
30
-
31
- def r_widget=(a_widget)
32
- @r_widget = a_widget
33
- @font_datum = nil
34
- end
35
-
36
- def font_datum
37
- @font_datum ||= @r_widget.widget.getFont.getFontData[0]
38
- end
39
-
40
- def name
41
- font_datum.getName
42
- end
43
-
44
- def height
45
- font_datum.getHeight
46
- end
47
-
48
- def style
49
- font_datum.getStyle
50
- end
51
-
52
- def font(font_properties)
53
- font_properties[:style] = RSwt[*font_properties[:style]]
54
- font_data_args = [:name, :height, :style].map do |font_property_name|
55
- font_properties[font_property_name] || send(font_property_name)
56
- end
57
- font_datum = FontData.new(*font_data_args)
58
- Font.new(@display, font_datum)
59
- end
60
- end
@@ -1,11 +0,0 @@
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,24 +0,0 @@
1
- require_relative '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
-
24
- end
@@ -1,18 +0,0 @@
1
- class RSwt
2
- class << self
3
- # Gets SWT constants as if calling SWT::CONSTANT where constant is
4
- # passed in as a lower case symbol
5
- def [](*symbols)
6
- symbols.compact.reduce(0) { |output, symbol| output | constant(symbol) }
7
- end
8
-
9
- def constant(symbol)
10
- return symbol if symbol.is_a?(Integer)
11
- swt_constant_symbol = symbol.to_s.upcase.to_sym
12
- org.eclipse.swt.SWT.const_get(swt_constant_symbol)
13
- rescue
14
- swt_constant_symbol = org.eclipse.swt.SWT.constants.find {|c| c.to_s.upcase == swt_constant_symbol.to_s}
15
- org.eclipse.swt.SWT.const_get(swt_constant_symbol)
16
- end
17
- end
18
- end