glimmer 0.7.7 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +288 -141
  4. data/VERSION +1 -1
  5. data/lib/glimmer.rb +0 -20
  6. data/lib/glimmer/config.rb +0 -13
  7. data/lib/glimmer/dsl/engine.rb +25 -18
  8. data/lib/glimmer/dsl/expression.rb +0 -7
  9. data/lib/glimmer/dsl/static_expression.rb +2 -2
  10. metadata +48 -171
  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/display_expression.rb +0 -19
  44. data/lib/glimmer/dsl/swt/dsl.rb +0 -28
  45. data/lib/glimmer/dsl/swt/exec_expression.rb +0 -28
  46. data/lib/glimmer/dsl/swt/layout_data_expression.rb +0 -25
  47. data/lib/glimmer/dsl/swt/layout_expression.rb +0 -27
  48. data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +0 -44
  49. data/lib/glimmer/dsl/swt/menu_bar_expression.rb +0 -33
  50. data/lib/glimmer/dsl/swt/menu_expression.rb +0 -32
  51. data/lib/glimmer/dsl/swt/observe_expression.rb +0 -32
  52. data/lib/glimmer/dsl/swt/property_expression.rb +0 -22
  53. data/lib/glimmer/dsl/swt/rgb_expression.rb +0 -12
  54. data/lib/glimmer/dsl/swt/rgba_expression.rb +0 -12
  55. data/lib/glimmer/dsl/swt/shell_expression.rb +0 -25
  56. data/lib/glimmer/dsl/swt/swt_expression.rb +0 -25
  57. data/lib/glimmer/dsl/swt/sync_exec_expression.rb +0 -15
  58. data/lib/glimmer/dsl/swt/tab_item_expression.rb +0 -33
  59. data/lib/glimmer/dsl/swt/table_items_data_binding_expression.rb +0 -31
  60. data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +0 -31
  61. data/lib/glimmer/dsl/swt/tree_properties_expression.rb +0 -26
  62. data/lib/glimmer/dsl/swt/widget_expression.rb +0 -34
  63. data/lib/glimmer/dsl/swt/widget_listener_expression.rb +0 -32
  64. data/lib/glimmer/dsl/xml/dsl.rb +0 -11
  65. data/lib/glimmer/dsl/xml/html_expression.rb +0 -25
  66. data/lib/glimmer/dsl/xml/meta_expression.rb +0 -23
  67. data/lib/glimmer/dsl/xml/name_space_expression.rb +0 -37
  68. data/lib/glimmer/dsl/xml/node_parent_expression.rb +0 -33
  69. data/lib/glimmer/dsl/xml/tag_expression.rb +0 -29
  70. data/lib/glimmer/dsl/xml/text_expression.rb +0 -22
  71. data/lib/glimmer/dsl/xml/xml_expression.rb +0 -21
  72. data/lib/glimmer/launcher.rb +0 -196
  73. data/lib/glimmer/package.rb +0 -7
  74. data/lib/glimmer/rake_task.rb +0 -89
  75. data/lib/glimmer/scaffold.rb +0 -478
  76. data/lib/glimmer/swt/color_proxy.rb +0 -53
  77. data/lib/glimmer/swt/display_proxy.rb +0 -74
  78. data/lib/glimmer/swt/font_proxy.rb +0 -72
  79. data/lib/glimmer/swt/layout_data_proxy.rb +0 -84
  80. data/lib/glimmer/swt/layout_proxy.rb +0 -82
  81. data/lib/glimmer/swt/menu_proxy.rb +0 -84
  82. data/lib/glimmer/swt/packages.rb +0 -13
  83. data/lib/glimmer/swt/shell_proxy.rb +0 -170
  84. data/lib/glimmer/swt/swt_proxy.rb +0 -106
  85. data/lib/glimmer/swt/tab_item_proxy.rb +0 -65
  86. data/lib/glimmer/swt/tree_proxy.rb +0 -120
  87. data/lib/glimmer/swt/widget_listener_proxy.rb +0 -34
  88. data/lib/glimmer/swt/widget_proxy.rb +0 -489
  89. data/lib/glimmer/ui/custom_shell.rb +0 -45
  90. data/lib/glimmer/ui/custom_widget.rb +0 -241
  91. data/lib/glimmer/util/proc_tracker.rb +0 -16
  92. data/lib/glimmer/xml/depth_first_search_iterator.rb +0 -22
  93. data/lib/glimmer/xml/name_space_visitor.rb +0 -21
  94. data/lib/glimmer/xml/node.rb +0 -75
  95. data/lib/glimmer/xml/node_visitor.rb +0 -13
  96. data/lib/glimmer/xml/xml_visitor.rb +0 -65
  97. data/vendor/swt/linux/swt.jar +0 -0
  98. data/vendor/swt/mac/swt.jar +0 -0
  99. data/vendor/swt/windows/swt.jar +0 -0
@@ -1,108 +0,0 @@
1
- require 'glimmer'
2
-
3
- require_relative 'observable'
4
- require_relative 'observer'
5
-
6
- module Glimmer
7
- module DataBinding
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
44
- end
45
-
46
- def property_observer_list(property_name)
47
- property_observer_hash[property_name.to_sym] = Set.new unless property_observer_hash[property_name.to_sym]
48
- property_observer_hash[property_name.to_sym]
49
- end
50
-
51
- def notify_observers(property_name)
52
- property_observer_list(property_name).each {|observer| observer.call(send(property_name))}
53
- end
54
- #TODO upon updating values, make sure dependent observers are cleared (not added as dependents here)
55
-
56
- def add_property_writer_observers(property_name)
57
- property_writer_name = "#{property_name}="
58
- method(property_writer_name)
59
- ensure_array_object_observer(property_name, send(property_name))
60
- begin
61
- method("__original_#{property_writer_name}")
62
- rescue
63
- # TODO consider alias_method or define_method instead
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::Config.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(observer.registration_for(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_observer_registration = array_object_observer.observe(object)
92
- property_observer_list(property_name).each do |observer|
93
- my_registration = observer.registration_for(self, property_name) # TODO eliminate repetition
94
- observer.add_dependent(my_registration => array_observer_registration)
95
- end
96
- array_object_observer_for(property_name).unregister(old_object) if old_object.is_a?(ObservableArray)
97
- end
98
-
99
- def array_object_observer_for(property_name)
100
- @array_object_observers ||= {}
101
- unless @array_object_observers.has_key?(property_name)
102
- @array_object_observers[property_name] = ObservableModel::Notifier.new(self, property_name)
103
- end
104
- @array_object_observers[property_name]
105
- end
106
- end
107
- end
108
- end
@@ -1,17 +0,0 @@
1
- module Glimmer
2
- module DataBinding
3
- module ObservableWidget
4
- # TODO see if it is worth it to eliminate duplication of method_missing
5
- # from WidgetProxy using a module
6
-
7
- def method_missing(method, *args, &block)
8
- method_name = method.to_s
9
- if can_handle_observation_request?(method_name)
10
- handle_observation_request(method_name, &block)
11
- else
12
- super
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,124 +0,0 @@
1
- require 'glimmer/error'
2
-
3
- module Glimmer
4
- module DataBinding
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 Registration < Struct.new(:observer, :observable, :property, keyword_init: true)
29
- def unregister
30
- observer.unobserve(observable, property)
31
- end
32
- alias unobserve unregister
33
- end
34
-
35
- class << self
36
- def proc(&observer_block)
37
- Proc.new(&observer_block)
38
- end
39
- end
40
-
41
- def registrations
42
- @registrations ||= Set.new
43
- end
44
-
45
- def registration_for(observable, property = nil)
46
- Registration.new(observer: self, observable: observable, property: property)
47
- end
48
-
49
- # mapping of registrations to dependents
50
- # {[observable, property] => [[dependent, dependent_observable, dependent_property], ...]}
51
- def dependents
52
- @dependents ||= Hash.new
53
- end
54
-
55
- def dependents_for(registration)
56
- dependents[registration] ||= Set.new
57
- end
58
-
59
- # registers observer in an observable on a property (optional)
60
- # observer maintains registration list to unregister later
61
- def register(observable, property = nil)
62
- unless observable.is_a?(Observable)
63
- # TODO refactor code to be more smart/polymorphic/automated and honor open/closed principle
64
- if observable.is_a?(Array)
65
- observable.extend(ObservableArray)
66
- else
67
- observable.extend(ObservableModel)
68
- end
69
- end
70
- observable.add_observer(*[self, property].compact)
71
- registration_for(observable, property).tap do |registration|
72
- self.registrations << registration
73
- end
74
- end
75
- alias observe register
76
-
77
- def unregister(observable, property = nil)
78
- # TODO optimize performance in the future via indexing and/or making a registration official object/class
79
- observable.remove_observer(*[self, property].compact)
80
- registration = registration_for(observable, property)
81
- dependents_for(registration).each do |dependent|
82
- dependent.unregister
83
- remove_dependent(registration => dependent)
84
- end
85
- registrations.delete(registration)
86
- end
87
- alias unobserve unregister
88
-
89
- def unregister_dependents_with_observable(registration, dependent_observable)
90
- thedependents = dependents_for(registration).select do |thedependent|
91
- thedependent.observable == dependent_observable
92
- end
93
- thedependents.each do |thedependent|
94
- thedependent.unregister
95
- end
96
- end
97
-
98
- # cleans up all registrations in observables
99
- def unregister_all_observables
100
- registrations.each do |registration|
101
- registration.unregister
102
- end
103
- end
104
- alias unobserve_all_observables unregister_all_observables
105
-
106
- # add dependent observer to unregister when unregistering observer
107
- def add_dependent(parent_to_dependent_hash)
108
- registration = parent_to_dependent_hash.keys.first
109
- dependent = parent_to_dependent_hash.values.first
110
- dependents_for(registration) << dependent
111
- end
112
-
113
- def remove_dependent(parent_to_dependent_hash)
114
- registration = parent_to_dependent_hash.keys.first
115
- dependent = parent_to_dependent_hash.values.first
116
- dependents_for(registration).delete(dependent)
117
- end
118
-
119
- def call(new_value)
120
- raise Error, 'Not implemented!'
121
- end
122
- end
123
- end
124
- end
@@ -1,23 +0,0 @@
1
- ## NOTE: Unsupported in Ruby 2 syntax
2
- #
3
- # require File.dirname(__FILE__) + "/glimmer"
4
- #
5
- # class Array
6
- # include Glimmer
7
- #
8
- # alias original_compare <=>
9
- #
10
- # def <=>(other)
11
- # if (self[0].class.name == "WidgetProxy")
12
- # content(self[0]) {
13
- # if (other.size == 2)
14
- # eval("#{self[1]} bind (other[0], other[1])")
15
- # elsif (other.size == 3)
16
- # eval("#{self[1]} bind (other[0], other[1], other[2])")
17
- # end
18
- # }
19
- # else
20
- # original_compare(other)
21
- # end
22
- # end
23
- # end
@@ -1,47 +0,0 @@
1
- require 'glimmer/data_binding/observable_array'
2
- require 'glimmer/data_binding/observable_model'
3
- require 'glimmer/data_binding/observable'
4
- require 'glimmer/data_binding/observer'
5
- require 'glimmer/swt/swt_proxy'
6
-
7
- module Glimmer
8
- module DataBinding
9
- class TableItemsBinding
10
- include DataBinding::Observable
11
- include DataBinding::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
- @table.on_widget_disposed do |dispose_event|
23
- unregister_all_observables
24
- end
25
- end
26
-
27
- def call(model_collection=nil)
28
- if model_collection and model_collection.is_a?(Array)
29
- # TODO clean observer registrations
30
- observe(model_collection, @column_properties)
31
- @model_collection = model_collection
32
- end
33
- populate_table(@model_collection, @table, @column_properties)
34
- end
35
-
36
- def populate_table(model_collection, parent, column_properties)
37
- parent.swt_widget.removeAll
38
- model_collection.each do |model|
39
- table_item = TableItem.new(parent.swt_widget, SWT::SWTProxy[:none])
40
- for index in 0..(column_properties.size-1)
41
- table_item.setText(index, model.send(column_properties[index]).to_s)
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,71 +0,0 @@
1
- require 'glimmer/data_binding/observable_array'
2
- require 'glimmer/data_binding/observable_model'
3
- require 'glimmer/data_binding/observable'
4
- require 'glimmer/data_binding/observer'
5
- require 'glimmer/swt/swt_proxy'
6
-
7
- module Glimmer
8
- module DataBinding
9
- class TreeItemsBinding
10
- include DataBinding::Observable
11
- include DataBinding::Observer
12
-
13
- include_package 'org.eclipse.swt'
14
- include_package 'org.eclipse.swt.widgets'
15
-
16
- def initialize(parent, model_binding, tree_properties)
17
- @tree = parent
18
- @model_binding = model_binding
19
- @tree_properties = [tree_properties].flatten.first.to_h
20
- if @tree.respond_to?(:tree_properties=)
21
- @tree.tree_properties = @tree_properties
22
- else # assume custom widget
23
- @tree.body_root.tree_properties = @tree_properties
24
- end
25
- call
26
- model = model_binding.base_model
27
- observe(model, model_binding.property_name_expression)
28
- @tree.on_widget_disposed do |dispose_event|
29
- unregister_all_observables
30
- end
31
- end
32
-
33
- def call(new_value=nil)
34
- @model_tree_root_node = @model_binding.evaluate_property
35
- populate_tree(@model_tree_root_node, @tree, @tree_properties)
36
- end
37
-
38
- def populate_tree(model_tree_root_node, parent, tree_properties)
39
- # TODO make it change things by delta instead of removing all
40
- selected_tree_item_model = parent.swt_widget.getSelection.map(&:getData).first
41
- old_tree_items = parent.all_tree_items
42
- old_tree_item_expansion_by_data = old_tree_items.reduce({}) {|hash, ti| hash.merge(ti.getData => ti.getExpanded)}
43
- old_tree_items.each do |tree_item|
44
- tree_item.getData('observer_registrations').each do |key, observer_registration|
45
- observer_registration.unregister
46
- end
47
- end
48
- parent.swt_widget.removeAll
49
- populate_tree_node(model_tree_root_node, parent.swt_widget, tree_properties)
50
- parent.all_tree_items.each { |ti| ti.setExpanded(!!old_tree_item_expansion_by_data[ti.getData]) }
51
- tree_item_to_select = parent.depth_first_search {|ti| ti.getData == selected_tree_item_model}
52
- parent.swt_widget.setSelection(tree_item_to_select)
53
- end
54
-
55
- def populate_tree_node(model_tree_node, parent, tree_properties)
56
- return if model_tree_node.nil?
57
- # TODO anticipate default tree properties if none were passed (like literal values text and children)
58
- tree_item = TreeItem.new(parent, SWT::SWTProxy[:none])
59
- observer_registrations = @tree_properties.reduce({}) do |hash, key_value_pair|
60
- hash.merge(key_value_pair.first => observe(model_tree_node, key_value_pair.last))
61
- end
62
- tree_item.setData('observer_registrations', observer_registrations)
63
- tree_item.setData(model_tree_node)
64
- tree_item.setText((model_tree_node && model_tree_node.send(tree_properties[:text])).to_s)
65
- [model_tree_node && model_tree_node.send(tree_properties[:children])].flatten.to_a.compact.each do |child|
66
- populate_tree_node(child, tree_item, tree_properties)
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,33 +0,0 @@
1
- require 'glimmer'
2
- require_relative 'observable'
3
- require_relative 'observer'
4
-
5
- module Glimmer
6
- module DataBinding
7
- class WidgetBinding
8
- include Glimmer
9
- include Observable
10
- include Observer
11
-
12
- attr_reader :widget, :property
13
- def initialize(model, property, translator = nil)
14
- @widget = model
15
- @property = property
16
- @translator = translator || proc {|value| value}
17
-
18
- if @widget.respond_to?(:dispose)
19
- @widget.on_widget_disposed do |dispose_event|
20
- unregister_all_observables
21
- end
22
- end
23
- end
24
- def call(value)
25
- converted_value = translated_value = @translator.call(value)
26
- @widget.set_attribute(@property, converted_value) unless evaluate_property == converted_value
27
- end
28
- def evaluate_property
29
- @widget.get_attribute(@property)
30
- end
31
- end
32
- end
33
- end
@@ -1,21 +0,0 @@
1
- require 'glimmer/dsl/static_expression'
2
- require 'glimmer/dsl/top_level_expression'
3
- require 'glimmer/dsl/parent_expression'
4
- require 'glimmer/css/style_sheet'
5
-
6
- module Glimmer
7
- module DSL
8
- module CSS
9
- # This static html expression flips the DSL switch on for
10
- # XML DSL in Glimmer
11
- class CssExpression < StaticExpression
12
- include TopLevelExpression
13
- include ParentExpression
14
-
15
- def interpret(parent, keyword, *args, &block)
16
- Glimmer::CSS::StyleSheet.new
17
- end
18
- end
19
- end
20
- end
21
- end