glimmer-dsl-swt 0.2.1 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d324a6327e85a840d2a980ba78a47fa9c50e927b409f128c60d9b2ac38f2124
4
- data.tar.gz: ace770a87429cbaca623310837618e14f12e8375221c433751e1feb13e768eff
3
+ metadata.gz: ce119763646f3e3ccc0211534317572ed02c5d21b9820387dec34d83b714e50f
4
+ data.tar.gz: 1c4486c574ab3e8d30957133b9aab200dcfbdea10ea1c4aa0279a4991f80a0dd
5
5
  SHA512:
6
- metadata.gz: 0d7e8c740b9fb6a8993e906a485cdc50241ea5a12664ff4f9ec128de2b2f77ad9718ae41fb0e9bd391546127273769769a1ac259870f2327bd29bba18d40afe3
7
- data.tar.gz: 56406b25d9ab52e5af2043f33860cbd8cc0a5681b4e7eeba77325122c71cf9897c7bcd6f19ea68e3b3171f1e0dfa07c8d8dc501297fce2e8c83cc37ba3ed024b
6
+ metadata.gz: cea6c2e7ac8920d4ae87e447f08c7a622fc8851827b76160dc07b36d8c725911bf94a772aa5f47e43465a24961f7dc38b1d974a164ec3704d159dee61deb7712
7
+ data.tar.gz: 8efbb95213218c052cbcc8165dc2305c41f26a42f1a374ba05fd9b5912c3a79bfbb99522a524c8cc0fa88b128c471ab22e03fb75a750b7dd31708617b4c6b4cf
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # <img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 /> Glimmer DSL for SWT 0.2.1 (Desktop GUI)
1
+ # <img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 /> Glimmer DSL for SWT 0.3.1 (Desktop GUI)
2
2
  [![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)
3
3
  [![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer-dsl-swt/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer-dsl-swt?branch=master)
@@ -10,7 +10,7 @@
10
10
 
11
11
  You may find full setup/usage instructions at the main [Glimmer project page](https://github.com/AndyObtiva/glimmer).
12
12
 
13
- Other Glimmer DSL gems:
13
+ Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
14
14
  - [glimmer-dsl-opal](https://github.com/AndyObtiva/glimmer-dsl-opal): Glimmer DSL for Opal (Web GUI Adapter for Desktop Apps)
15
15
  - [glimmer-dsl-xml](https://github.com/AndyObtiva/glimmer-dsl-xml): Glimmer DSL for XML (& HTML)
16
16
  - [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS (Cascading Style Sheets)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.1
@@ -15,6 +15,7 @@ module Glimmer
15
15
  def initialize(parent, model_binding, column_properties)
16
16
  @table = parent
17
17
  @model_binding = model_binding
18
+ @table.swt_widget.data = @model_binding
18
19
  @column_properties = column_properties
19
20
  if @table.respond_to?(:column_properties=)
20
21
  @table.column_properties = @column_properties
@@ -0,0 +1,20 @@
1
+ require 'glimmer/dsl/expression'
2
+
3
+ module Glimmer
4
+ module DSL
5
+ module SWT
6
+ class BlockPropertyExpression < Expression
7
+ def can_interpret?(parent, keyword, *args, &block)
8
+ block_given? and
9
+ args.size == 0 and
10
+ parent.respond_to?("#{keyword}_block=")
11
+ end
12
+
13
+ def interpret(parent, keyword, *args, &block)
14
+ parent.send("#{keyword}_block=", block)
15
+ nil
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -35,6 +35,10 @@ module Glimmer
35
35
  parent.on_widget_selected do
36
36
  model_binding.call(widget_binding.evaluate_property)
37
37
  end
38
+
39
+ parent.on_modify_text do
40
+ model_binding.call(widget_binding.evaluate_property)
41
+ end
38
42
  end
39
43
  end
40
44
  end
@@ -25,6 +25,7 @@ module Glimmer
25
25
  table_items_data_binding
26
26
  data_binding
27
27
  property
28
+ block_property
28
29
  widget
29
30
  custom_widget
30
31
  ]
@@ -31,5 +31,7 @@ module Glimmer
31
31
  end
32
32
 
33
33
  require 'glimmer/swt/widget_proxy'
34
+ require 'glimmer/swt/scrolled_composite_proxy'
34
35
  require 'glimmer/swt/tree_proxy'
35
36
  require 'glimmer/swt/table_proxy'
37
+ require 'glimmer/swt/table_column_proxy'
@@ -7,6 +7,12 @@ module Glimmer
7
7
  class << self
8
8
  attr_accessor :javapackager_extra_args
9
9
 
10
+ def clean
11
+ require 'fileutils'
12
+ FileUtils.rm_rf('dist')
13
+ FileUtils.rm_rf('packages')
14
+ end
15
+
10
16
  def config
11
17
  project_name = File.basename(File.expand_path('.'))
12
18
  if !File.exists?('config/warble.rb')
@@ -15,7 +21,7 @@ module Glimmer
15
21
  system('warble config')
16
22
  new_config = File.read('config/warble.rb').split("\n").inject('') do |output, line|
17
23
  if line.include?('config.dirs =')
18
- line = line.sub('# ', '').sub(/=[^=\n]+$/, '= %w(app config db lib script bin docs fonts icons images sounds videos)')
24
+ line = line.sub('# ', '').sub(/=[^=\n]+$/, '= %w(app config db lib script bin docs fonts icons images sounds videos vendor)')
19
25
  end
20
26
  if line.include?('config.includes =')
21
27
  line = line.sub('# ', '').sub(/=[^=\n]+$/, "= FileList['LICENSE.txt', 'VERSION']")
@@ -4,6 +4,11 @@ require_relative 'package'
4
4
 
5
5
  namespace :glimmer do
6
6
  namespace :package do
7
+ desc 'Clean by removing "dist" and "packages" directories'
8
+ task :clean do
9
+ Glimmer::Package.clean
10
+ end
11
+
7
12
  desc 'Generate JAR config file'
8
13
  task :config do
9
14
  Glimmer::Package.config
@@ -58,7 +58,7 @@ class Scaffold
58
58
 
59
59
  # for a library or gem, you might want to ignore these files since the code is
60
60
  # intended to run in multiple environments; otherwise, check them in:
61
- Gemfile.lock
61
+ # Gemfile.lock
62
62
  # .ruby-version
63
63
  # .ruby-gemset
64
64
 
@@ -179,6 +179,7 @@ class Scaffold
179
179
  end
180
180
 
181
181
  def custom_shell_gem(custom_shell_name, namespace)
182
+ return puts('Namespace is required! Usage: glimmer scaffold:custom_shell_gem[custom_shell_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
182
183
  gem_name = "glimmer-cs-#{compact_name(custom_shell_name)}"
183
184
  gem_summary = "#{human_name(custom_shell_name)} - Glimmer Custom Shell"
184
185
  if namespace
@@ -218,6 +219,7 @@ class Scaffold
218
219
  end
219
220
 
220
221
  def custom_widget_gem(custom_widget_name, namespace)
222
+ return puts('Namespace is required! Usage: glimmer scaffold:custom_widget_gem[custom_widget_name,namespace]') unless `git config --get github.user`.to_s.strip == 'AndyObtiva'
221
223
  gem_name = "glimmer-cw-#{compact_name(custom_widget_name)}"
222
224
  gem_summary = "#{human_name(custom_widget_name)} - Glimmer Custom Widget"
223
225
  if namespace
@@ -483,12 +485,10 @@ class Scaffold
483
485
  custom_shell_file_content += <<-MULTI_LINE_STRING
484
486
 
485
487
  def display_about_dialog
486
- message_box = MessageBox.new(swt_widget)
487
- message_box.setText("About")
488
- message = "#{human_name(namespace)} - #{human_name(custom_shell_name)} \#{VERSION}\n\n"
489
- message += LICENSE
490
- message_box.setMessage(message)
491
- message_box.open
488
+ message_box(body_root) {
489
+ text 'About'
490
+ message "#{human_name(namespace)} - #{human_name(custom_shell_name)} \#{VERSION}\\n\\n\#{LICENSE}"
491
+ }.open
492
492
  end
493
493
 
494
494
  def display_preferences_dialog
@@ -0,0 +1,21 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ class ScrolledCompositeProxy < Glimmer::SWT::WidgetProxy
6
+ def initialize(underscored_widget_name, parent, args)
7
+ unless args.first.is_a?(Numeric)
8
+ args.unshift(:h_scroll)
9
+ args.unshift(:v_scroll)
10
+ end
11
+ super
12
+ swt_widget.expand_horizontal = true
13
+ swt_widget.expand_vertical = true
14
+ end
15
+
16
+ def post_initialize_child(child)
17
+ swt_widget.content = child.swt_widget
18
+ end
19
+ end
20
+ end
21
+ end
@@ -130,7 +130,11 @@ module Glimmer
130
130
  # This method is not needed except in rare circumstances where there is a need to start the SWT Event Loop before opening the shell.
131
131
  def start_event_loop
132
132
  until @swt_widget.isDisposed
133
- @display.sleep unless @display.readAndDispatch
133
+ begin
134
+ @display.sleep unless @display.readAndDispatch
135
+ rescue => e
136
+ Glimmer::Config.logger&.debug e.full_message
137
+ end
134
138
  end
135
139
  end
136
140
 
@@ -31,7 +31,8 @@ module Glimmer
31
31
  end
32
32
 
33
33
  EXTRA_STYLES = {
34
- NO_RESIZE: self[:shell_trim, :resize!, :max!]
34
+ NO_RESIZE: self[:shell_trim, :resize!, :max!],
35
+ NO_SORT: -7,
35
36
  }
36
37
  end
37
38
  end
@@ -0,0 +1,28 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ class TableColumnProxy < Glimmer::SWT::WidgetProxy
6
+ attr_reader :no_sort, :sort_property, :editor
7
+ alias no_sort? no_sort
8
+ attr_accessor :sort_block, :sort_by_block
9
+
10
+ def initialize(underscored_widget_name, parent, args)
11
+ @no_sort = args.delete(:no_sort)
12
+ super
13
+ on_widget_selected do |event|
14
+ parent.sort_by_column(self)
15
+ end unless no_sort?
16
+ end
17
+
18
+ def sort_property=(args)
19
+ @sort_property = args unless args.empty?
20
+ end
21
+
22
+ def editor=(args)
23
+ @editor = args
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -23,8 +23,8 @@ module Glimmer
23
23
  def find_table_item_and_column_index
24
24
  {}.tap do |result|
25
25
  if respond_to?(:x) && respond_to?(:y)
26
- result[:table_item] = widget.getItems.detect do |ti|
27
- result[:column_index] = widget.getColumnCount.times.to_a.detect do |ci|
26
+ result[:table_item] = widget.items.detect do |ti|
27
+ result[:column_index] = widget.column_count.times.to_a.detect do |ci|
28
28
  ti.getBounds(ci).contains(x, y)
29
29
  end
30
30
  end
@@ -33,7 +33,61 @@ module Glimmer
33
33
  end
34
34
  end
35
35
 
36
- attr_reader :table_editor, :table_editor_text_proxy
36
+ class << self
37
+ def editors
38
+ @editors ||= {
39
+ text: {
40
+ widget_value_property: :text,
41
+ editor_gui: lambda do |args, model, property, table_proxy|
42
+ table_proxy.table_editor.minimumHeight = 20
43
+ table_editor_widget_proxy = text(*args) {
44
+ text model.send(property)
45
+ focus true
46
+ on_focus_lost {
47
+ table_proxy.finish_edit!
48
+ }
49
+ on_key_pressed { |key_event|
50
+ if key_event.keyCode == swt(:cr)
51
+ table_proxy.finish_edit!
52
+ elsif key_event.keyCode == swt(:esc)
53
+ table_proxy.cancel_edit!
54
+ end
55
+ }
56
+ }
57
+ table_editor_widget_proxy.swt_widget.selectAll
58
+ table_editor_widget_proxy
59
+ end,
60
+ },
61
+ combo: {
62
+ widget_value_property: :text,
63
+ editor_gui: lambda do |args, model, property, table_proxy|
64
+ table_proxy.table_editor.minimumHeight = 25
65
+ table_editor_widget_proxy = combo(*args) {
66
+ items model.send("#{property}_options")
67
+ text model.send(property)
68
+ focus true
69
+ on_focus_lost {
70
+ table_proxy.finish_edit!
71
+ }
72
+ on_key_pressed { |key_event|
73
+ if key_event.keyCode == swt(:cr)
74
+ table_proxy.finish_edit!
75
+ elsif key_event.keyCode == swt(:esc)
76
+ table_proxy.cancel_edit!
77
+ end
78
+ }
79
+ on_widget_selected {
80
+ table_proxy.finish_edit!
81
+ }
82
+ }
83
+ table_editor_widget_proxy
84
+ end,
85
+ }
86
+ }
87
+ end
88
+ end
89
+
90
+ attr_reader :table_editor, :table_editor_text_proxy, :table_editor_widget_proxy, :sort_property, :sort_direction, :sort_block, :sort_type, :sort_by_block, :additional_sort_properties, :editor
37
91
  attr_accessor :column_properties
38
92
 
39
93
  def initialize(underscored_widget_name, parent, args)
@@ -43,7 +97,95 @@ module Glimmer
43
97
  @table_editor.grabHorizontal = true
44
98
  @table_editor.minimumHeight = 20
45
99
  end
46
-
100
+
101
+ def model_binding
102
+ swt_widget.data
103
+ end
104
+
105
+ def sort_by_column(table_column_proxy)
106
+ index = swt_widget.columns.to_a.index(table_column_proxy.swt_widget)
107
+ new_sort_property = table_column_proxy.sort_property || [column_properties[index]]
108
+ if new_sort_property.size == 1 && !additional_sort_properties.to_a.empty?
109
+ selected_additional_sort_properties = additional_sort_properties.clone
110
+ if selected_additional_sort_properties.include?(new_sort_property.first)
111
+ selected_additional_sort_properties.delete(new_sort_property.first)
112
+ new_sort_property += selected_additional_sort_properties
113
+ else
114
+ new_sort_property += additional_sort_properties
115
+ end
116
+ end
117
+
118
+ @sort_direction = @sort_direction.nil? || @sort_property != new_sort_property || @sort_direction == :descending ? :ascending : :descending
119
+ swt_widget.sort_direction = @sort_direction == :ascending ? SWTProxy[:up] : SWTProxy[:down]
120
+
121
+ @sort_property = new_sort_property
122
+ swt_widget.sort_column = table_column_proxy.swt_widget
123
+
124
+ @sort_by_block = nil
125
+ @sort_block = nil
126
+ @sort_type = nil
127
+ if table_column_proxy.sort_by_block
128
+ @sort_by_block = table_column_proxy.sort_by_block
129
+ elsif table_column_proxy.sort_block
130
+ @sort_block = table_column_proxy.sort_block
131
+ else
132
+ detect_sort_type
133
+ end
134
+ sort
135
+ end
136
+
137
+ def detect_sort_type
138
+ @sort_type = sort_property.size.times.map { String }
139
+ array = model_binding.evaluate_property
140
+ sort_property.each_with_index do |a_sort_property, i|
141
+ values = array.map { |object| object.send(a_sort_property) }
142
+ value_classes = values.map(&:class).uniq
143
+ if value_classes.size == 1
144
+ @sort_type[i] = value_classes.first
145
+ elsif value_classes.include?(Integer)
146
+ @sort_type[i] = Integer
147
+ elsif value_classes.include?(Float)
148
+ @sort_type[i] = Float
149
+ end
150
+ end
151
+ end
152
+
153
+ def additional_sort_properties=(args)
154
+ @additional_sort_properties = args unless args.empty?
155
+ end
156
+
157
+ def editor=(args)
158
+ @editor = args
159
+ end
160
+
161
+ def sort
162
+ return unless sort_property && (sort_type || sort_block || sort_by_block)
163
+ array = model_binding.evaluate_property
164
+ # Converting value to_s first to handle nil cases. Should work with numeric, boolean, and date fields
165
+ if sort_block
166
+ sorted_array = array.sort(&sort_block)
167
+ elsif sort_by_block
168
+ sorted_array = array.sort_by(&sort_by_block)
169
+ else
170
+ sorted_array = array.sort_by do |object|
171
+ sort_property.each_with_index.map do |a_sort_property, i|
172
+ value = object.send(a_sort_property)
173
+ # handle nil and difficult to compare types gracefully
174
+ if sort_type[i] == Integer
175
+ value = value.to_i
176
+ elsif sort_type[i] == Float
177
+ value = value.to_f
178
+ elsif sort_type[i] == String
179
+ value = value.to_s
180
+ end
181
+ value
182
+ end
183
+ end
184
+ end
185
+ sorted_array = sorted_array.reverse if sort_direction == :descending
186
+ model_binding.call(sorted_array)
187
+ end
188
+
47
189
  # Performs a search for table items matching block condition
48
190
  # If no condition block is passed, returns all table items
49
191
  # Returns a Java TableItem array to easily set as selection on org.eclipse.swt.Table if needed
@@ -68,6 +210,14 @@ module Glimmer
68
210
  })
69
211
  end
70
212
 
213
+ def post_initialize_child(table_column_proxy)
214
+ table_column_proxies << table_column_proxy
215
+ end
216
+
217
+ def table_column_proxies
218
+ @table_column_proxies ||= []
219
+ end
220
+
71
221
  # Indicates if table is in edit mode, thus displaying a text widget for a table item cell
72
222
  def edit_mode?
73
223
  !!@edit_mode
@@ -93,58 +243,62 @@ module Glimmer
93
243
 
94
244
  def edit_table_item(table_item, column_index, before_write: nil, after_write: nil, after_cancel: nil)
95
245
  return if table_item.nil?
246
+ model = table_item.data
247
+ property = column_properties[column_index]
96
248
  @cancel_edit&.call if @edit_mode
249
+ action_taken = false
97
250
  @edit_mode = true
98
- content {
99
- @table_editor_text_proxy = text {
100
- focus true
101
- text table_item.getText(column_index)
102
- action_taken = false
103
- @cancel_edit = lambda do
104
- @cancel_in_progress = true
105
- @table_editor_text_proxy&.swt_widget&.dispose
106
- @table_editor_text_proxy = nil
107
- after_cancel&.call
251
+
252
+ editor_config = table_column_proxies[column_index].editor || editor
253
+ editor_config = editor_config.to_a
254
+ editor_widget_options = editor_config.last.is_a?(Hash) ? editor_config.last : {}
255
+ editor_widget_arg_last_index = editor_config.last.is_a?(Hash) ? -2 : -1
256
+ editor_widget = editor_config[0] || :text
257
+ editor_widget_args = editor_config[1..editor_widget_arg_last_index]
258
+ model_editing_property = editor_widget_options[:property] || property
259
+ widget_value_property = TableProxy::editors[editor_widget][:widget_value_property]
260
+
261
+ @cancel_edit = lambda do |event=nil|
262
+ @cancel_in_progress = true
263
+ @table_editor_widget_proxy&.swt_widget&.dispose
264
+ @table_editor_widget_proxy = nil
265
+ after_cancel&.call
266
+ @edit_in_progress = false
267
+ @cancel_in_progress = false
268
+ @cancel_edit = nil
269
+ @edit_mode = false
270
+ end
271
+
272
+ @finish_edit = lambda do |event=nil|
273
+ new_value = @table_editor_widget_proxy&.swt_widget&.send(widget_value_property)
274
+ if table_item.isDisposed
275
+ @cancel_edit.call
276
+ elsif new_value && !action_taken && !@edit_in_progress && !@cancel_in_progress
277
+ action_taken = true
278
+ @edit_in_progress = true
279
+ if new_value == model.send(model_editing_property)
280
+ @cancel_edit.call
281
+ else
282
+ before_write&.call
283
+ model.send("#{model_editing_property}=", new_value) # makes table update itself, so must search for selected table item again
284
+ # Table refresh happens here because of model update triggering observers, so must retrieve table item again
285
+ edited_table_item = search { |ti| ti.getData == model }.first
286
+ swt_widget.showItem(edited_table_item)
287
+ @table_editor_widget_proxy&.swt_widget&.dispose
288
+ @table_editor_widget_proxy = nil
289
+ after_write&.call(edited_table_item)
108
290
  @edit_in_progress = false
109
- @cancel_in_progress = false
110
- @cancel_edit = nil
111
- @edit_mode = false
112
- end
113
- @finish_edit = lambda do |event=nil|
114
- if table_item.isDisposed
115
- @cancel_edit.call
116
- elsif !action_taken && !@edit_in_progress && !@cancel_in_progress
117
- action_taken = true
118
- @edit_in_progress = true
119
- new_text = @table_editor_text_proxy.swt_widget.getText
120
- if new_text == table_item.getText(column_index)
121
- @cancel_edit.call
122
- else
123
- before_write&.call
124
- table_item.setText(column_index, new_text)
125
- model = table_item.getData
126
- model.send("#{column_properties[column_index]}=", new_text) # makes table update itself, so must search for selected table item again
127
- edited_table_item = search { |ti| ti.getData == model }.first
128
- swt_widget.showItem(edited_table_item)
129
- @table_editor_text_proxy&.swt_widget&.dispose
130
- @table_editor_text_proxy = nil
131
- after_write&.call(edited_table_item)
132
- @edit_in_progress = false
133
- end
134
- end
135
291
  end
136
- on_focus_lost(&@finish_edit)
137
- on_key_pressed { |key_event|
138
- if key_event.keyCode == swt(:cr)
139
- @finish_edit.call(key_event)
140
- elsif key_event.keyCode == swt(:esc)
141
- @cancel_edit.call
142
- end
143
- }
144
- }
145
- @table_editor_text_proxy.swt_widget.selectAll
292
+ end
293
+ end
294
+
295
+ content {
296
+ @table_editor_widget_proxy = @table_editor_text_proxy = TableProxy::editors[editor_widget][:editor_gui].call(editor_widget_args, model, model_editing_property, self)
146
297
  }
147
- @table_editor.setEditor(@table_editor_text_proxy.swt_widget, table_item, column_index)
298
+ @table_editor.setEditor(@table_editor_widget_proxy.swt_widget, table_item, column_index)
299
+ rescue => e
300
+ Glimmer::Config.logger&.error e.full_message
301
+ raise e
148
302
  end
149
303
 
150
304
  def add_listener(underscored_listener_name, &block)
@@ -61,6 +61,12 @@ module Glimmer
61
61
  swt_widget_class = self.class.swt_widget_class_for(underscored_widget_name)
62
62
  @swt_widget = swt_widget_class.new(parent.swt_widget, style(underscored_widget_name, styles), *extra_options)
63
63
  DEFAULT_INITIALIZERS[underscored_widget_name]&.call(@swt_widget)
64
+ parent.post_initialize_child(self)
65
+ end
66
+
67
+ # Subclasses may override to perform post initialization work on an added child
68
+ def post_initialize_child(child)
69
+ # No Op by default
64
70
  end
65
71
 
66
72
  def extract_args(underscored_widget_name, args)
@@ -145,6 +151,23 @@ module Glimmer
145
151
  observer.call(false)
146
152
  }
147
153
  end,
154
+ :selection => lambda do |observer|
155
+ on_widget_selected { |selection_event|
156
+ observer.call(@swt_widget.getSelection)
157
+ } if can_handle_observation_request?(:on_widget_selected)
158
+ end,
159
+ :text => lambda do |observer|
160
+ on_modify_text { |modify_event|
161
+ observer.call(@swt_widget.getText)
162
+ } if can_handle_observation_request?(:on_modify_text)
163
+ end,
164
+ },
165
+ Java::OrgEclipseSwtWidgets::Combo => {
166
+ :text => lambda do |observer|
167
+ on_modify_text { |modify_event|
168
+ observer.call(@swt_widget.getText)
169
+ }
170
+ end,
148
171
  },
149
172
  Java::OrgEclipseSwtWidgets::Text => {
150
173
  :text => lambda do |observer|
@@ -248,12 +271,12 @@ module Glimmer
248
271
  return nil
249
272
  end
250
273
  swt_widget_class
251
- rescue NameError => e
252
- Glimmer::Config.logger&.debug e.message
274
+ rescue SyntaxError, NameError => e
275
+ Glimmer::Config.logger&.debug e.full_message
253
276
  # Glimmer::Config.logger&.debug("#{e.message}\n#{e.backtrace.join("\n")}")
254
277
  nil
255
278
  rescue => e
256
- Glimmer::Config.logger&.debug e.message
279
+ Glimmer::Config.logger&.debug e.full_message
257
280
  # Glimmer::Config.logger&.debug("#{e.message}\n#{e.backtrace.join("\n")}")
258
281
  nil
259
282
  end
@@ -289,9 +312,7 @@ module Glimmer
289
312
  def add_observer(observer, property_name)
290
313
  property_listener_installers = @swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
291
314
  widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
292
- widget_listener_installers.to_a.each do |widget_listener_installer|
293
- widget_listener_installer.call(observer)
294
- end
315
+ widget_listener_installers.to_a.first&.call(observer)
295
316
  end
296
317
 
297
318
  def remove_observer(observer, property_name)
@@ -137,8 +137,9 @@ module Glimmer
137
137
  execute_hooks('after_body')
138
138
  @swt_widget = @body_root.swt_widget
139
139
  end
140
-
140
+
141
141
  def can_handle_observation_request?(observation_request)
142
+ observation_request = observation_request.to_s
142
143
  result = false
143
144
  if observation_request.start_with?('on_updated_')
144
145
  property = observation_request.sub(/^on_updated_/, '')
@@ -148,6 +149,7 @@ module Glimmer
148
149
  end
149
150
 
150
151
  def handle_observation_request(observation_request, &block)
152
+ observation_request = observation_request.to_s
151
153
  if observation_request.start_with?('on_updated_')
152
154
  property = observation_request.sub(/^on_updated_/, '') # TODO look into eliminating duplication from above
153
155
  add_observer(DataBinding::Observer.proc(&block), property) if can_add_observer?(property)
@@ -183,7 +185,9 @@ module Glimmer
183
185
 
184
186
  # This method ensures it has an instance method not coming from Glimmer DSL
185
187
  def has_instance_method?(method_name)
186
- respond_to?(method_name) && !method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb')
188
+ respond_to?(method_name) &&
189
+ !method(method_name)&.source_location&.first&.include?('glimmer/dsl/engine.rb') &&
190
+ !method(method_name)&.source_location&.first&.include?('glimmer/swt/widget_proxy.rb')
187
191
  end
188
192
 
189
193
  def get_attribute(attribute_name)
@@ -224,13 +228,14 @@ module Glimmer
224
228
  end
225
229
  end
226
230
 
227
- def dispose
228
- body_root.dispose
229
- end
230
-
231
231
  def method_missing(method, *args, &block)
232
232
  body_root.send(method, *args, &block)
233
233
  end
234
+
235
+ def respond_to?(method, *args, &block)
236
+ super or
237
+ body_root.respond_to?(method, *args, &block)
238
+ end
234
239
 
235
240
  private
236
241
 
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.1
4
+ version: 0.3.1
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-10 00:00:00.000000000 Z
11
+ date: 2020-07-18 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.3
18
+ version: 0.9.5
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.3
26
+ version: 0.9.5
27
27
  - !ruby/object:Gem::Dependency
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
@@ -256,7 +256,7 @@ dependencies:
256
256
  - - "~>"
257
257
  - !ruby/object:Gem::Version
258
258
  version: 0.7.0
259
- description: Glimmer DSL for SWT (Desktop GUI)
259
+ description: Glimmer DSL for SWT (Desktop GUI) - JRuby on SWT
260
260
  email: andy.am@gmail.com
261
261
  executables:
262
262
  - glimmer
@@ -285,6 +285,7 @@ files:
285
285
  - lib/glimmer/data_binding/widget_binding.rb
286
286
  - lib/glimmer/dsl/swt/async_exec_expression.rb
287
287
  - lib/glimmer/dsl/swt/bind_expression.rb
288
+ - lib/glimmer/dsl/swt/block_property_expression.rb
288
289
  - lib/glimmer/dsl/swt/color_expression.rb
289
290
  - lib/glimmer/dsl/swt/column_properties_expression.rb
290
291
  - lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb
@@ -328,10 +329,12 @@ files:
328
329
  - lib/glimmer/swt/menu_proxy.rb
329
330
  - lib/glimmer/swt/message_box_proxy.rb
330
331
  - lib/glimmer/swt/packages.rb
332
+ - lib/glimmer/swt/scrolled_composite_proxy.rb
331
333
  - lib/glimmer/swt/shell_proxy.rb
332
334
  - lib/glimmer/swt/style_constantizable.rb
333
335
  - lib/glimmer/swt/swt_proxy.rb
334
336
  - lib/glimmer/swt/tab_item_proxy.rb
337
+ - lib/glimmer/swt/table_column_proxy.rb
335
338
  - lib/glimmer/swt/table_proxy.rb
336
339
  - lib/glimmer/swt/tree_proxy.rb
337
340
  - lib/glimmer/swt/widget_listener_proxy.rb