glimmer-dsl-swt 0.1.1 → 0.2.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.
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-swt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-15 00:00:00.000000000 Z
11
+ date: 2020-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.9.0
18
+ version: 0.9.3
19
19
  name: glimmer
20
20
  type: :runtime
21
21
  prerelease: false
@@ -23,7 +23,7 @@ dependencies:
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.0
26
+ version: 0.9.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -57,7 +57,7 @@ dependencies:
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.8.1
60
+ version: 0.8.2
61
61
  name: puts_debuggerer
62
62
  type: :runtime
63
63
  prerelease: false
@@ -65,7 +65,27 @@ dependencies:
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.8.1
68
+ version: 0.8.2
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.2.4
75
+ - - "<"
76
+ - !ruby/object:Gem::Version
77
+ version: 2.0.0
78
+ name: text-table
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 1.2.4
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: 2.0.0
69
89
  - !ruby/object:Gem::Dependency
70
90
  requirement: !ruby/object:Gem::Requirement
71
91
  requirements:
@@ -194,6 +214,48 @@ dependencies:
194
214
  - - "~>"
195
215
  - !ruby/object:Gem::Version
196
216
  version: 3.5.0
217
+ - !ruby/object:Gem::Dependency
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 0.8.23
223
+ name: coveralls
224
+ type: :development
225
+ prerelease: false
226
+ version_requirements: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - '='
229
+ - !ruby/object:Gem::Version
230
+ version: 0.8.23
231
+ - !ruby/object:Gem::Dependency
232
+ requirement: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 0.16.1
237
+ name: simplecov
238
+ type: :development
239
+ prerelease: false
240
+ version_requirements: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - "~>"
243
+ - !ruby/object:Gem::Version
244
+ version: 0.16.1
245
+ - !ruby/object:Gem::Dependency
246
+ requirement: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: 0.7.0
251
+ name: simplecov-lcov
252
+ type: :development
253
+ prerelease: false
254
+ version_requirements: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - "~>"
257
+ - !ruby/object:Gem::Version
258
+ version: 0.7.0
197
259
  description: Glimmer DSL for SWT (Desktop GUI)
198
260
  email: andy.am@gmail.com
199
261
  executables:
@@ -216,12 +278,7 @@ files:
216
278
  - lib/ext/glimmer/config.rb
217
279
  - lib/glimmer-dsl-swt.rb
218
280
  - lib/glimmer/data_binding/list_selection_binding.rb
219
- - lib/glimmer/data_binding/model_binding.rb
220
- - lib/glimmer/data_binding/observable.rb
221
- - lib/glimmer/data_binding/observable_array.rb
222
- - lib/glimmer/data_binding/observable_model.rb
223
281
  - lib/glimmer/data_binding/observable_widget.rb
224
- - lib/glimmer/data_binding/observer.rb
225
282
  - lib/glimmer/data_binding/shine.rb
226
283
  - lib/glimmer/data_binding/table_items_binding.rb
227
284
  - lib/glimmer/data_binding/tree_items_binding.rb
@@ -235,6 +292,7 @@ files:
235
292
  - lib/glimmer/dsl/swt/data_binding_expression.rb
236
293
  - lib/glimmer/dsl/swt/dialog_expression.rb
237
294
  - lib/glimmer/dsl/swt/display_expression.rb
295
+ - lib/glimmer/dsl/swt/dnd_expression.rb
238
296
  - lib/glimmer/dsl/swt/dsl.rb
239
297
  - lib/glimmer/dsl/swt/exec_expression.rb
240
298
  - lib/glimmer/dsl/swt/layout_data_expression.rb
@@ -259,9 +317,11 @@ files:
259
317
  - lib/glimmer/launcher.rb
260
318
  - lib/glimmer/package.rb
261
319
  - lib/glimmer/rake_task.rb
320
+ - lib/glimmer/rake_task/list.rb
262
321
  - lib/glimmer/scaffold.rb
263
322
  - lib/glimmer/swt/color_proxy.rb
264
323
  - lib/glimmer/swt/display_proxy.rb
324
+ - lib/glimmer/swt/dnd_proxy.rb
265
325
  - lib/glimmer/swt/font_proxy.rb
266
326
  - lib/glimmer/swt/layout_data_proxy.rb
267
327
  - lib/glimmer/swt/layout_proxy.rb
@@ -269,6 +329,7 @@ files:
269
329
  - lib/glimmer/swt/message_box_proxy.rb
270
330
  - lib/glimmer/swt/packages.rb
271
331
  - lib/glimmer/swt/shell_proxy.rb
332
+ - lib/glimmer/swt/style_constantizable.rb
272
333
  - lib/glimmer/swt/swt_proxy.rb
273
334
  - lib/glimmer/swt/tab_item_proxy.rb
274
335
  - lib/glimmer/swt/table_proxy.rb
@@ -1,248 +0,0 @@
1
- require 'glimmer/data_binding/observable'
2
- require 'glimmer/data_binding/observer'
3
-
4
- module Glimmer
5
- module DataBinding
6
- class ModelBinding
7
- include Observable
8
- include Observer
9
-
10
- attr_reader :binding_options
11
-
12
- def initialize(base_model, property_name_expression, binding_options = nil)
13
- @base_model = base_model
14
- @property_name_expression = property_name_expression
15
- @binding_options = binding_options || {}
16
- if computed?
17
- @computed_model_bindings = computed_by.map do |computed_by_property_expression|
18
- self.class.new(base_model, computed_by_property_expression)
19
- end
20
- end
21
- end
22
-
23
- def model
24
- nested_property? ? nested_model : base_model
25
- end
26
-
27
- # e.g. person.address.state returns [person, person.address]
28
- def nested_models
29
- @nested_models = [base_model]
30
- model_property_names.reduce(base_model) do |reduced_model, nested_model_property_name|
31
- if reduced_model.nil?
32
- nil
33
- else
34
- invoke_property_reader(reduced_model, nested_model_property_name).tap do |new_reduced_model|
35
- @nested_models << new_reduced_model
36
- end
37
- end
38
- end
39
- @nested_models
40
- end
41
-
42
- def nested_model
43
- nested_models.last
44
- end
45
-
46
- def base_model
47
- @base_model
48
- end
49
-
50
- def property_name
51
- nested_property? ? nested_property_name : property_name_expression
52
- end
53
-
54
- def convert_on_read(value)
55
- apply_converter(@binding_options[:on_read], value)
56
- end
57
-
58
- def convert_on_write(value)
59
- apply_converter(@binding_options[:on_write], value)
60
- end
61
-
62
- def apply_converter(converter, value)
63
- if converter.nil?
64
- value
65
- elsif converter.is_a?(String) || converter.is_a?(Symbol)
66
- if value.respond_to?(converter)
67
- value.send(converter)
68
- else
69
- raise Glimmer::Error, "Unsupported bind converter: #{converter.inspect}"
70
- end
71
- elsif converter.respond_to?(:call, value)
72
- converter.call(value)
73
- else
74
- raise Glimmer::Error, "Unsupported bind converter: #{converter.inspect}"
75
- end
76
- end
77
-
78
- # All nested property names
79
- # e.g. property name expression "address.state" gives ['address', 'state']
80
- # If there are any indexed property names, this returns indexes as properties.
81
- # e.g. property name expression "addresses[1].state" gives ['addresses', '[1]', 'state']
82
- def nested_property_names
83
- @nested_property_names ||= property_name_expression.split(".").map {|pne| pne.match(/([^\[]+)(\[[^\]]+\])?/).to_a.drop(1)}.flatten.compact
84
- end
85
-
86
- # Final nested property name
87
- # e.g. property name expression "address.state" gives :state
88
- def nested_property_name
89
- nested_property_names.last
90
- end
91
-
92
- # Model representing nested property names
93
- # e.g. property name expression "address.state" gives [:address]
94
- def model_property_names
95
- nested_property_names[0...-1]
96
- end
97
-
98
- def nested_property?
99
- property_name_expression.match(/[.\[]/)
100
- end
101
-
102
- def property_name_expression
103
- @property_name_expression
104
- end
105
-
106
- def computed?
107
- !computed_by.empty?
108
- end
109
-
110
- def computed_by
111
- [@binding_options[:computed_by]].flatten.compact
112
- end
113
-
114
- def nested_property_observers_for(observer)
115
- @nested_property_observers_collection ||= {}
116
- unless @nested_property_observers_collection.has_key?(observer)
117
- @nested_property_observers_collection[observer] = nested_property_names.reduce({}) do |output, property_name|
118
- output.merge(
119
- property_name => Observer.proc do |new_value|
120
- # Ensure reattaching observers when a higher level nested property is updated (e.g. person.address changes reattaches person.address.street observer)
121
- add_observer(observer)
122
- observer.call(evaluate_property)
123
- end
124
- )
125
- end
126
- end
127
- @nested_property_observers_collection[observer]
128
- end
129
-
130
- def add_observer(observer)
131
- if computed?
132
- add_computed_observers(observer)
133
- elsif nested_property?
134
- add_nested_observers(observer)
135
- else
136
- model_binding_observer = Observer.proc do |new_value|
137
- observer.call(evaluate_property)
138
- end
139
- observer_registration = model_binding_observer.observe(model, property_name)
140
- my_registration = observer.registration_for(self)
141
- observer.add_dependent(my_registration => observer_registration)
142
- end
143
- end
144
-
145
- def remove_observer(observer)
146
- if computed?
147
- @computed_model_bindings.each do |computed_model_binding|
148
- computed_observer_for(observer).unobserve(computed_model_binding)
149
- end
150
- @computed_observer_collection.delete(observer)
151
- elsif nested_property?
152
- nested_property_observers_for(observer).clear
153
- else
154
- observer.unobserve(model, property_name)
155
- end
156
- end
157
-
158
- def computed_observer_for(observer)
159
- @computed_observer_collection ||= {}
160
- unless @computed_observer_collection.has_key?(observer)
161
- @computed_observer_collection[observer] = Observer.proc do |new_value|
162
- observer.call(evaluate_property)
163
- end
164
- end
165
- @computed_observer_collection[observer]
166
- end
167
-
168
- def add_computed_observers(observer)
169
- @computed_model_bindings.each do |computed_model_binding|
170
- observer_registration = computed_observer_for(observer).observe(computed_model_binding)
171
- my_registration = observer.registration_for(self)
172
- observer.add_dependent(my_registration => observer_registration)
173
- end
174
- end
175
-
176
- def add_nested_observers(observer)
177
- nested_property_observers = nested_property_observers_for(observer)
178
- nested_models.zip(nested_property_names).each_with_index do |zip, i|
179
- model, property_name = zip
180
- nested_property_observer = nested_property_observers[property_name]
181
- previous_index = i - 1
182
- parent_model = previous_index.negative? ? self : nested_models[previous_index]
183
- parent_property_name = previous_index.negative? ? nil : nested_property_names[previous_index]
184
- parent_observer = previous_index.negative? ? observer : nested_property_observers[parent_property_name]
185
- parent_property_name = nil if parent_property_name.to_s.start_with?('[')
186
- unless model.nil?
187
- if property_indexed?(property_name)
188
- # TODO figure out a way to deal with this more uniformly
189
- observer_registration = nested_property_observer.observe(model)
190
- else
191
- observer_registration = nested_property_observer.observe(model, property_name)
192
- end
193
- parent_registration = parent_observer.registration_for(parent_model, parent_property_name)
194
- parent_observer.add_dependent(parent_registration => observer_registration)
195
- end
196
- end
197
- end
198
-
199
- def call(value)
200
- return if model.nil?
201
- converted_value = value
202
- invoke_property_writer(model, "#{property_name}=", converted_value) unless evaluate_property == converted_value
203
- end
204
-
205
- def evaluate_property
206
- value = nil
207
- value = invoke_property_reader(model, property_name) unless model.nil?
208
- convert_on_read(value)
209
- end
210
-
211
- def evaluate_options_property
212
- model.send(options_property_name) unless model.nil?
213
- end
214
-
215
- def options_property_name
216
- self.property_name + "_options"
217
- end
218
-
219
- def property_indexed?(property_expression)
220
- property_expression.to_s.start_with?('[')
221
- end
222
-
223
- def invoke_property_reader(object, property_expression)
224
- if property_indexed?(property_expression)
225
- property_method = '[]'
226
- property_argument = property_expression[1...-1]
227
- property_argument = property_argument.to_i if property_argument.match(/\d+/)
228
- object.send(property_method, property_argument)
229
- else
230
- object.send(property_expression)
231
- end
232
- end
233
-
234
- def invoke_property_writer(object, property_expression, value)
235
- return if @binding_options[:read_only]
236
- value = convert_on_write(value)
237
- if property_indexed?(property_expression)
238
- property_method = '[]='
239
- property_argument = property_expression[1...-2]
240
- property_argument = property_argument.to_i if property_argument.match(/\d+/)
241
- object.send(property_method, property_argument, value)
242
- else
243
- object.send(property_expression, value)
244
- end
245
- end
246
- end
247
- end
248
- end
@@ -1,21 +0,0 @@
1
- require 'glimmer/error'
2
-
3
- module Glimmer
4
- module DataBinding
5
- module Observable
6
- # TODO rename methods to observe/unobserve
7
- def add_observer(observer, property_or_properties=nil)
8
- raise Error, 'Not implemented!'
9
- end
10
-
11
- def remove_observer(observer, property_or_properties=nil)
12
- raise Error, 'Not implemented!'
13
- end
14
-
15
- # Overriding inspect to avoid printing very long observer hierarchies
16
- def inspect
17
- "#<#{self.class.name}:0x#{self.hash.to_s(16)}>"
18
- end
19
- end
20
- end
21
- end
@@ -1,107 +0,0 @@
1
- require 'set'
2
-
3
- require_relative 'observable'
4
-
5
- module Glimmer
6
- module DataBinding
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
- # TODO consider alias_method, and define_method instead
46
-
47
- array.instance_eval("alias __original_add <<")
48
- array.instance_eval <<-end_eval, __FILE__, __LINE__
49
- def <<(value)
50
- self.__original_add(value)
51
- notify_observers
52
- end
53
- end_eval
54
-
55
- array.instance_eval("alias __original_set_value []=")
56
- array.instance_eval <<-end_eval, __FILE__, __LINE__
57
- def []=(index, value)
58
- old_value = self[index]
59
- unregister_dependent_observers(old_value)
60
- self.__original_set_value(index, value)
61
- notify_observers
62
- end
63
- end_eval
64
-
65
- array.instance_eval("alias __original_delete delete")
66
- array.instance_eval <<-end_eval, __FILE__, __LINE__
67
- def delete(value)
68
- unregister_dependent_observers(value)
69
- self.__original_delete(value)
70
- notify_observers
71
- end
72
- end_eval
73
-
74
- array.instance_eval("alias __original_delete_at delete_at")
75
- array.instance_eval <<-end_eval, __FILE__, __LINE__
76
- def delete_at(index)
77
- old_value = self[index]
78
- unregister_dependent_observers(old_value)
79
- self.__original_delete_at(index)
80
- notify_observers
81
- end
82
- end_eval
83
-
84
- array.instance_eval("alias __original_clear clear")
85
- array.instance_eval <<-end_eval, __FILE__, __LINE__
86
- def clear
87
- each do |old_value|
88
- unregister_dependent_observers(old_value)
89
- end
90
- self.__original_clear
91
- notify_observers
92
- end
93
- end_eval
94
-
95
- super
96
- end
97
-
98
- def unregister_dependent_observers(old_value)
99
- # TODO look into optimizing this
100
- return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
101
- property_observer_list.each do |observer|
102
- observer.unregister_dependents_with_observable(observer.registration_for(self), old_value)
103
- end
104
- end
105
- end
106
- end
107
- end