glimmer-dsl-swt 0.2.4 → 0.5.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.
@@ -3,7 +3,6 @@ require 'glimmer/swt/color_proxy'
3
3
  require 'glimmer/swt/font_proxy'
4
4
  require 'glimmer/swt/swt_proxy'
5
5
  require 'glimmer/swt/dnd_proxy'
6
- require 'glimmer/data_binding/observable_widget'
7
6
 
8
7
  # TODO refactor to make file smaller and extract sub-widget-proxies out of this
9
8
 
@@ -20,11 +19,10 @@ module Glimmer
20
19
  # Follows the Proxy Design Pattern
21
20
  class WidgetProxy
22
21
  include Packages
23
- include DataBinding::ObservableWidget
24
22
 
25
23
  DEFAULT_STYLES = {
26
24
  "text" => [:border],
27
- "table" => [:border],
25
+ "table" => [:virtual, :border],
28
26
  "tree" => [:virtual, :border, :h_scroll, :v_scroll],
29
27
  "spinner" => [:border],
30
28
  "styled_text" => [:border],
@@ -60,6 +58,7 @@ module Glimmer
60
58
  styles, extra_options = extract_args(underscored_widget_name, args)
61
59
  swt_widget_class = self.class.swt_widget_class_for(underscored_widget_name)
62
60
  @swt_widget = swt_widget_class.new(parent.swt_widget, style(underscored_widget_name, styles), *extra_options)
61
+ @swt_widget.set_data('proxy', self)
63
62
  DEFAULT_INITIALIZERS[underscored_widget_name]&.call(@swt_widget)
64
63
  parent.post_initialize_child(self)
65
64
  end
@@ -176,44 +175,44 @@ module Glimmer
176
175
  }
177
176
  end,
178
177
  :caret_position => lambda do |observer|
179
- on_event_keydown { |event|
178
+ on_swt_keydown { |event|
180
179
  observer.call(@swt_widget.getCaretPosition)
181
180
  }
182
- on_event_keyup { |event|
181
+ on_swt_keyup { |event|
183
182
  observer.call(@swt_widget.getCaretPosition)
184
183
  }
185
- on_event_mousedown { |event|
184
+ on_swt_mousedown { |event|
186
185
  observer.call(@swt_widget.getCaretPosition)
187
186
  }
188
- on_event_mouseup { |event|
187
+ on_swt_mouseup { |event|
189
188
  observer.call(@swt_widget.getCaretPosition)
190
189
  }
191
190
  end,
192
191
  :selection => lambda do |observer|
193
- on_event_keydown { |event|
192
+ on_swt_keydown { |event|
194
193
  observer.call(@swt_widget.getSelection)
195
194
  }
196
- on_event_keyup { |event|
195
+ on_swt_keyup { |event|
197
196
  observer.call(@swt_widget.getSelection)
198
197
  }
199
- on_event_mousedown { |event|
198
+ on_swt_mousedown { |event|
200
199
  observer.call(@swt_widget.getSelection)
201
200
  }
202
- on_event_mouseup { |event|
201
+ on_swt_mouseup { |event|
203
202
  observer.call(@swt_widget.getSelection)
204
203
  }
205
204
  end,
206
205
  :selection_count => lambda do |observer|
207
- on_event_keydown { |event|
206
+ on_swt_keydown { |event|
208
207
  observer.call(@swt_widget.getSelectionCount)
209
208
  }
210
- on_event_keyup { |event|
209
+ on_swt_keyup { |event|
211
210
  observer.call(@swt_widget.getSelectionCount)
212
211
  }
213
- on_event_mousedown { |event|
212
+ on_swt_mousedown { |event|
214
213
  observer.call(@swt_widget.getSelectionCount)
215
214
  }
216
- on_event_mouseup { |event|
215
+ on_swt_mouseup { |event|
217
216
  observer.call(@swt_widget.getSelectionCount)
218
217
  }
219
218
  end,
@@ -267,17 +266,17 @@ module Glimmer
267
266
  swt_widget_name = underscored_widget_name.camelcase(:upper)
268
267
  swt_widget_class = eval(swt_widget_name)
269
268
  unless swt_widget_class.ancestors.include?(org.eclipse.swt.widgets.Widget)
270
- Glimmer::Config.logger&.debug("Class #{swt_widget_class} matching #{underscored_widget_name} is not a subclass of org.eclipse.swt.widgets.Widget")
269
+ Glimmer::Config.logger.debug {"Class #{swt_widget_class} matching #{underscored_widget_name} is not a subclass of org.eclipse.swt.widgets.Widget"}
271
270
  return nil
272
271
  end
273
272
  swt_widget_class
274
- rescue NameError => e
275
- Glimmer::Config.logger&.debug e.full_message
276
- # Glimmer::Config.logger&.debug("#{e.message}\n#{e.backtrace.join("\n")}")
273
+ rescue SyntaxError, NameError => e
274
+ Glimmer::Config.logger.debug {e.full_message}
275
+ # Glimmer::Config.logger.debug {"#{e.message}\n#{e.backtrace.join("\n")}"}
277
276
  nil
278
277
  rescue => e
279
- Glimmer::Config.logger&.debug e.full_message
280
- # Glimmer::Config.logger&.debug("#{e.message}\n#{e.backtrace.join("\n")}")
278
+ Glimmer::Config.logger.debug {e.full_message}
279
+ # Glimmer::Config.logger.debug {"#{e.message}\n#{e.backtrace.join("\n")}"}
281
280
  nil
282
281
  end
283
282
 
@@ -336,10 +335,10 @@ module Glimmer
336
335
 
337
336
  # TODO eliminate duplication in the following methods perhaps by relying on exceptions
338
337
 
339
- def can_handle_observation_request?(observation_request)
338
+ def can_handle_observation_request?(observation_request)
340
339
  observation_request = observation_request.to_s
341
- if observation_request.start_with?('on_event_')
342
- constant_name = observation_request.sub(/^on_event_/, '')
340
+ if observation_request.start_with?('on_swt_')
341
+ constant_name = observation_request.sub(/^on_swt_/, '')
343
342
  SWTProxy.has_constant?(constant_name)
344
343
  elsif observation_request.start_with?('on_')
345
344
  event = observation_request.sub(/^on_/, '')
@@ -357,6 +356,9 @@ module Glimmer
357
356
  @drag_source_proxy = nil
358
357
  end
359
358
  end
359
+ rescue => e
360
+ Glimmer::Config.logger.debug {e.full_message}
361
+ false
360
362
  end
361
363
 
362
364
  def can_handle_drop_observation_request?(observation_request)
@@ -372,8 +374,9 @@ module Glimmer
372
374
  end
373
375
 
374
376
  def handle_observation_request(observation_request, &block)
375
- if observation_request.start_with?('on_event_')
376
- constant_name = observation_request.sub(/^on_event_/, '')
377
+ observation_request = observation_request.to_s
378
+ if observation_request.start_with?('on_swt_')
379
+ constant_name = observation_request.sub(/^on_swt_/, '')
377
380
  add_swt_event_listener(constant_name, &block)
378
381
  elsif observation_request.start_with?('on_')
379
382
  event = observation_request.sub(/^on_/, '')
@@ -392,6 +395,23 @@ module Glimmer
392
395
  Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::SWT::WidgetExpression.new, &block)
393
396
  end
394
397
 
398
+ def method_missing(method, *args, &block)
399
+ if can_handle_observation_request?(method)
400
+ handle_observation_request(method, &block)
401
+ else
402
+ swt_widget.send(method, *args, &block)
403
+ end
404
+ rescue => e
405
+ Glimmer::Config.logger.debug {"Neither WidgetProxy nor #{swt_widget.class.name} can handle the method ##{method}"}
406
+ super
407
+ end
408
+
409
+ def respond_to?(method, *args, &block)
410
+ super ||
411
+ can_handle_observation_request?(method) ||
412
+ swt_widget.respond_to?(method, *args, &block)
413
+ end
414
+
395
415
  private
396
416
 
397
417
  def style(underscored_widget_name, styles)
@@ -437,7 +457,7 @@ module Glimmer
437
457
  def add_listener(underscored_listener_name, &block)
438
458
  widget_add_listener_method, listener_class, listener_method = self.class.find_listener(@swt_widget.getClass, underscored_listener_name)
439
459
  widget_listener_proxy = nil
440
- safe_block = lambda { |event| block.call(event) unless @swt_widget.isDisposed }
460
+ safe_block = lambda { |*args| block.call(*args) unless @swt_widget.isDisposed }
441
461
  listener = listener_class.new(listener_method => safe_block)
442
462
  @swt_widget.send(widget_add_listener_method, listener)
443
463
  widget_listener_proxy = WidgetListenerProxy.new(swt_widget: @swt_widget, swt_listener: listener, widget_add_listener_method: widget_add_listener_method, swt_listener_class: listener_class, swt_listener_method: listener_method)
@@ -479,9 +499,9 @@ module Glimmer
479
499
  listener_class.define_method('initialize') do |event_method_block_mapping|
480
500
  @event_method_block_mapping = event_method_block_mapping
481
501
  end
482
- listener_type.getMethods.each do |event_method|
483
- listener_class.define_method(event_method.getName) do |event|
484
- @event_method_block_mapping[event_method.getName]&.call(event)
502
+ listener_type.getMethods.each do |event_method|
503
+ listener_class.define_method(event_method.getName) do |*args|
504
+ @event_method_block_mapping[event_method.getName]&.call(*args)
485
505
  end
486
506
  end
487
507
  end
@@ -492,7 +512,7 @@ module Glimmer
492
512
  def add_swt_event_listener(swt_constant, &block)
493
513
  event_type = SWTProxy[swt_constant]
494
514
  widget_listener_proxy = nil
495
- safe_block = lambda { |event| block.call(event) unless @swt_widget.isDisposed }
515
+ safe_block = lambda { |*args| block.call(*args) unless @swt_widget.isDisposed }
496
516
  @swt_widget.addListener(event_type, &safe_block)
497
517
  widget_listener_proxy = WidgetListenerProxy.new(swt_widget: @swt_widget, swt_listener: @swt_widget.getListeners(event_type).last, event_type: event_type, swt_constant: swt_constant)
498
518
  end
@@ -579,7 +599,7 @@ module Glimmer
579
599
  end
580
600
  image_data = ImageData.new(value)
581
601
  # TODO in the future, look into unregistering this listener when no longer needed
582
- on_event_Resize do |resize_event|
602
+ on_swt_Resize do |resize_event|
583
603
  new_image_data = image_data.scaledTo(@swt_widget.getSize.x, @swt_widget.getSize.y)
584
604
  @swt_widget.getBackgroundImage&.dispose
585
605
  @swt_widget.setBackgroundImage(Image.new(@swt_widget.getDisplay, new_image_data))
@@ -5,9 +5,10 @@ module Glimmer
5
5
  module CustomShell
6
6
  include SuperModule
7
7
  include Glimmer::UI::CustomWidget
8
-
8
+
9
9
  def initialize(parent, *swt_constants, options, &content)
10
10
  super
11
+ @swt_widget.set_data('custom_shell', self)
11
12
  raise Error, 'Invalid custom shell body root! Must be a shell or another custom shell.' unless body_root.swt_widget.is_a?(org.eclipse.swt.widgets.Shell)
12
13
  end
13
14
 
@@ -5,7 +5,6 @@ require 'glimmer/swt/display_proxy'
5
5
  require 'glimmer/util/proc_tracker'
6
6
  require 'glimmer/data_binding/observer'
7
7
  require 'glimmer/data_binding/observable_model'
8
- require 'glimmer/data_binding/observable_widget'
9
8
 
10
9
  module Glimmer
11
10
  module UI
@@ -15,7 +14,6 @@ module Glimmer
15
14
 
16
15
  super_module_included do |klass|
17
16
  klass.include(Glimmer) unless klass.name.include?('Glimmer::UI::CustomShell')
18
- klass.prepend DataBinding::ObservableWidget
19
17
  Glimmer::UI::CustomWidget.add_custom_widget_namespaces_for(klass) unless klass.name.include?('Glimmer::UI::CustomShell')
20
18
  end
21
19
 
@@ -36,15 +34,15 @@ module Glimmer
36
34
  return constant if constant.ancestors.include?(Glimmer::UI::CustomWidget)
37
35
  constant
38
36
  rescue => e
39
- # Glimmer::Config.logger&.debug "#{e.message}\n#{e.backtrace.join("\n")}"
37
+ # Glimmer::Config.logger.debug {"#{e.message}\n#{e.backtrace.join("\n")}"}
40
38
  result
41
39
  end
42
40
  end
43
41
  end
44
42
  raise "#{underscored_custom_widget_name} has no custom widget class!"
45
43
  rescue => e
46
- Glimmer::Config.logger&.debug e.message
47
- Glimmer::Config.logger&.debug "#{e.message}\n#{e.backtrace.join("\n")}"
44
+ Glimmer::Config.logger.debug {e.message}
45
+ Glimmer::Config.logger.debug {"#{e.message}\n#{e.backtrace.join("\n")}"}
48
46
  nil
49
47
  end
50
48
 
@@ -134,16 +132,18 @@ module Glimmer
134
132
  body_block = self.class.instance_variable_get("@body_block")
135
133
  raise Glimmer::Error, 'Invalid custom widget for having no body! Please define body block!' if body_block.nil?
136
134
  @body_root = instance_exec(&body_block)
137
- execute_hooks('after_body')
138
135
  @swt_widget = @body_root.swt_widget
136
+ @swt_widget.set_data('custom_widget', self)
137
+ execute_hooks('after_body')
139
138
  end
140
139
 
141
140
  # Subclasses may override to perform post initialization work on an added child
142
141
  def post_initialize_child(child)
143
- body_root.post_initialize_child(child)
144
- end
142
+ # No Op by default
143
+ end
145
144
 
146
145
  def can_handle_observation_request?(observation_request)
146
+ observation_request = observation_request.to_s
147
147
  result = false
148
148
  if observation_request.start_with?('on_updated_')
149
149
  property = observation_request.sub(/^on_updated_/, '')
@@ -153,6 +153,7 @@ module Glimmer
153
153
  end
154
154
 
155
155
  def handle_observation_request(observation_request, &block)
156
+ observation_request = observation_request.to_s
156
157
  if observation_request.start_with?('on_updated_')
157
158
  property = observation_request.sub(/^on_updated_/, '') # TODO look into eliminating duplication from above
158
159
  add_observer(DataBinding::Observer.proc(&block), property) if can_add_observer?(property)
@@ -162,7 +163,7 @@ module Glimmer
162
163
  end
163
164
 
164
165
  def can_add_observer?(attribute_name)
165
- has_instance_method?(attribute_name) || respond_to?("#{attribute_name}?") || @body_root.can_add_observer?(attribute_name)
166
+ has_instance_method?(attribute_name) || has_instance_method?("#{attribute_name}?") || @body_root.can_add_observer?(attribute_name)
166
167
  end
167
168
 
168
169
  def add_observer(observer, attribute_name)
@@ -174,12 +175,12 @@ module Glimmer
174
175
  end
175
176
 
176
177
  def has_attribute?(attribute_name, *args)
177
- respond_to?(attribute_setter(attribute_name), args) ||
178
+ has_instance_method?(attribute_setter(attribute_name)) ||
178
179
  @body_root.has_attribute?(attribute_name, *args)
179
180
  end
180
181
 
181
182
  def set_attribute(attribute_name, *args)
182
- if respond_to?(attribute_setter(attribute_name), args)
183
+ if has_instance_method?(attribute_setter(attribute_name))
183
184
  send(attribute_setter(attribute_name), *args)
184
185
  else
185
186
  @body_root.set_attribute(attribute_name, *args)
@@ -188,7 +189,10 @@ module Glimmer
188
189
 
189
190
  # This method ensures it has an instance method not coming from Glimmer DSL
190
191
  def has_instance_method?(method_name)
191
- respond_to?(method_name) && !method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb')
192
+ respond_to?(method_name) &&
193
+ !swt_widget.respond_to?(method_name) &&
194
+ !method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb') &&
195
+ !method(method_name)&.source_location&.first&.include?('glimmer/swt/widget_proxy.rb')
192
196
  end
193
197
 
194
198
  def get_attribute(attribute_name)
@@ -203,7 +207,6 @@ module Glimmer
203
207
  "#{attribute_name}="
204
208
  end
205
209
 
206
-
207
210
  def has_style?(style)
208
211
  (swt_style & SWT::SWTProxy[style]) == SWT::SWTProxy[style]
209
212
  end
@@ -229,12 +232,19 @@ module Glimmer
229
232
  end
230
233
  end
231
234
 
232
- def dispose
233
- body_root.dispose
234
- end
235
-
236
235
  def method_missing(method, *args, &block)
237
- body_root.send(method, *args, &block)
236
+ if can_handle_observation_request?(method)
237
+ handle_observation_request(method, &block)
238
+ else
239
+ body_root.send(method, *args, &block)
240
+ end
241
+ end
242
+
243
+ alias local_respond_to? respond_to?
244
+ def respond_to?(method, *args, &block)
245
+ super or
246
+ can_handle_observation_request?(method) or
247
+ body_root.respond_to?(method, *args, &block)
238
248
  end
239
249
 
240
250
  private
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.2.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-15 00:00:00.000000000 Z
11
+ date: 2020-07-27 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.4
18
+ version: 0.10.1
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.4
26
+ version: 0.10.1
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.2
60
+ version: 0.9.0
61
61
  name: puts_debuggerer
62
62
  type: :runtime
63
63
  prerelease: false
@@ -65,67 +65,67 @@ dependencies:
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.8.2
68
+ version: 0.9.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 1.2.4
74
+ version: 2.3.9
75
75
  - - "<"
76
76
  - !ruby/object:Gem::Version
77
- version: 2.0.0
78
- name: text-table
77
+ version: 3.0.0
78
+ name: jeweler
79
79
  type: :runtime
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
83
  - - ">="
84
84
  - !ruby/object:Gem::Version
85
- version: 1.2.4
85
+ version: 2.3.9
86
86
  - - "<"
87
87
  - !ruby/object:Gem::Version
88
- version: 2.0.0
88
+ version: 3.0.0
89
89
  - !ruby/object:Gem::Dependency
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 1.0.0
94
+ version: 2.3.0
95
95
  - - "<"
96
96
  - !ruby/object:Gem::Version
97
- version: 2.0.0
98
- name: os
97
+ version: 3.0.0
98
+ name: logging
99
99
  type: :runtime
100
100
  prerelease: false
101
101
  version_requirements: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="
104
104
  - !ruby/object:Gem::Version
105
- version: 1.0.0
105
+ version: 2.3.0
106
106
  - - "<"
107
107
  - !ruby/object:Gem::Version
108
- version: 2.0.0
108
+ version: 3.0.0
109
109
  - !ruby/object:Gem::Dependency
110
110
  requirement: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
- version: 2.0.5
114
+ version: 1.0.0
115
115
  - - "<"
116
116
  - !ruby/object:Gem::Version
117
- version: 3.0.0
118
- name: warbler
117
+ version: 2.0.0
118
+ name: os
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - ">="
124
124
  - !ruby/object:Gem::Version
125
- version: 2.0.5
125
+ version: 1.0.0
126
126
  - - "<"
127
127
  - !ruby/object:Gem::Version
128
- version: 3.0.0
128
+ version: 2.0.0
129
129
  - !ruby/object:Gem::Dependency
130
130
  requirement: !ruby/object:Gem::Requirement
131
131
  requirements:
@@ -151,41 +151,61 @@ dependencies:
151
151
  requirements:
152
152
  - - ">="
153
153
  - !ruby/object:Gem::Version
154
- version: 2.3.9
154
+ version: 6.2.1
155
155
  - - "<"
156
156
  - !ruby/object:Gem::Version
157
- version: 3.0.0
158
- name: jeweler
157
+ version: 7.0.0
158
+ name: rdoc
159
159
  type: :runtime
160
160
  prerelease: false
161
161
  version_requirements: !ruby/object:Gem::Requirement
162
162
  requirements:
163
163
  - - ">="
164
164
  - !ruby/object:Gem::Version
165
- version: 2.3.9
165
+ version: 6.2.1
166
166
  - - "<"
167
167
  - !ruby/object:Gem::Version
168
- version: 3.0.0
168
+ version: 7.0.0
169
169
  - !ruby/object:Gem::Dependency
170
170
  requirement: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - ">="
173
173
  - !ruby/object:Gem::Version
174
- version: 6.2.1
174
+ version: 1.2.4
175
175
  - - "<"
176
176
  - !ruby/object:Gem::Version
177
- version: 7.0.0
178
- name: rdoc
177
+ version: 2.0.0
178
+ name: text-table
179
179
  type: :runtime
180
180
  prerelease: false
181
181
  version_requirements: !ruby/object:Gem::Requirement
182
182
  requirements:
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: 6.2.1
185
+ version: 1.2.4
186
186
  - - "<"
187
187
  - !ruby/object:Gem::Version
188
- version: 7.0.0
188
+ version: 2.0.0
189
+ - !ruby/object:Gem::Dependency
190
+ requirement: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: 2.0.5
195
+ - - "<"
196
+ - !ruby/object:Gem::Version
197
+ version: 3.0.0
198
+ name: warbler
199
+ type: :runtime
200
+ prerelease: false
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: 2.0.5
206
+ - - "<"
207
+ - !ruby/object:Gem::Version
208
+ version: 3.0.0
189
209
  - !ruby/object:Gem::Dependency
190
210
  requirement: !ruby/object:Gem::Requirement
191
211
  requirements: