glimmer-dsl-swt 4.18.4.8 → 4.18.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -0
  3. data/README.md +24 -11
  4. data/VERSION +1 -1
  5. data/bin/glimmer +3 -3
  6. data/docs/reference/GLIMMER_CONFIGURATION.md +7 -3
  7. data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +353 -145
  8. data/docs/reference/GLIMMER_SAMPLES.md +207 -41
  9. data/glimmer-dsl-swt.gemspec +33 -15
  10. data/lib/ext/glimmer/config.rb +3 -7
  11. data/lib/glimmer/data_binding/list_selection_binding.rb +13 -7
  12. data/lib/glimmer/data_binding/table_items_binding.rb +22 -17
  13. data/lib/glimmer/data_binding/tree_items_binding.rb +19 -15
  14. data/lib/glimmer/data_binding/widget_binding.rb +13 -15
  15. data/lib/glimmer/dsl/swt/{file_dialog_expression.rb → auto_exec_expression.rb} +6 -18
  16. data/lib/glimmer/dsl/swt/checkbox_group_selection_data_binding_expression.rb +9 -6
  17. data/lib/glimmer/dsl/swt/color_expression.rb +1 -1
  18. data/lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb +16 -14
  19. data/lib/glimmer/dsl/swt/custom_widget_expression.rb +4 -1
  20. data/lib/glimmer/dsl/swt/data_binding_expression.rb +2 -2
  21. data/lib/glimmer/dsl/swt/dialog_expression.rb +18 -9
  22. data/lib/glimmer/dsl/swt/dsl.rb +1 -0
  23. data/lib/glimmer/dsl/swt/exec_expression.rb +1 -1
  24. data/lib/glimmer/dsl/swt/font_expression.rb +1 -1
  25. data/lib/glimmer/dsl/swt/image_expression.rb +18 -3
  26. data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +11 -8
  27. data/lib/glimmer/dsl/swt/pixel_expression.rb +1 -1
  28. data/lib/glimmer/dsl/swt/radio_group_selection_data_binding_expression.rb +9 -5
  29. data/lib/glimmer/dsl/swt/shape_expression.rb +1 -1
  30. data/lib/glimmer/dsl/swt/shell_expression.rb +5 -2
  31. data/lib/glimmer/dsl/swt/widget_expression.rb +8 -4
  32. data/lib/glimmer/launcher.rb +3 -0
  33. data/lib/glimmer/rake_task/scaffold.rb +3 -0
  34. data/lib/glimmer/swt/color_proxy.rb +1 -1
  35. data/lib/glimmer/swt/custom/code_text.rb +33 -11
  36. data/lib/glimmer/swt/custom/drawable.rb +50 -2
  37. data/lib/glimmer/swt/custom/radio_group.rb +2 -1
  38. data/lib/glimmer/swt/custom/shape.rb +166 -34
  39. data/lib/glimmer/{dsl/swt/directory_dialog_expression.rb → swt/custom/shape/arc.rb} +15 -20
  40. data/lib/glimmer/swt/custom/shape/focus.rb +43 -0
  41. data/lib/glimmer/swt/custom/shape/image.rb +86 -0
  42. data/lib/glimmer/swt/custom/shape/line.rb +58 -0
  43. data/lib/glimmer/swt/custom/shape/oval.rb +43 -0
  44. data/lib/glimmer/swt/custom/shape/point.rb +52 -0
  45. data/lib/glimmer/swt/custom/shape/polygon.rb +73 -0
  46. data/lib/glimmer/swt/custom/shape/polyline.rb +73 -0
  47. data/lib/glimmer/swt/custom/shape/rectangle.rb +87 -0
  48. data/lib/glimmer/swt/custom/shape/text.rb +73 -0
  49. data/lib/glimmer/swt/date_time_proxy.rb +9 -3
  50. data/lib/glimmer/swt/dialog_proxy.rb +92 -0
  51. data/lib/glimmer/swt/display_proxy.rb +62 -2
  52. data/lib/glimmer/swt/expand_item_proxy.rb +18 -12
  53. data/lib/glimmer/swt/font_proxy.rb +13 -7
  54. data/lib/glimmer/swt/image_proxy.rb +16 -5
  55. data/lib/glimmer/swt/layout_data_proxy.rb +21 -15
  56. data/lib/glimmer/swt/layout_proxy.rb +19 -15
  57. data/lib/glimmer/swt/menu_proxy.rb +2 -2
  58. data/lib/glimmer/swt/message_box_proxy.rb +21 -7
  59. data/lib/glimmer/swt/properties.rb +3 -0
  60. data/lib/glimmer/swt/proxy_properties.rb +145 -0
  61. data/lib/glimmer/swt/scrolled_composite_proxy.rb +20 -7
  62. data/lib/glimmer/swt/shell_proxy.rb +96 -80
  63. data/lib/glimmer/swt/swt_proxy.rb +17 -0
  64. data/lib/glimmer/swt/tab_item_proxy.rb +6 -3
  65. data/lib/glimmer/swt/table_proxy.rb +32 -11
  66. data/lib/glimmer/swt/transform_proxy.rb +26 -38
  67. data/lib/glimmer/swt/tree_proxy.rb +11 -16
  68. data/lib/glimmer/swt/widget_listener_proxy.rb +6 -2
  69. data/lib/glimmer/swt/widget_proxy.rb +194 -137
  70. data/lib/glimmer/ui.rb +5 -0
  71. data/lib/glimmer/ui/custom_shell.rb +13 -7
  72. data/lib/glimmer/ui/custom_widget.rb +4 -5
  73. data/samples/elaborate/contact_manager.rb +7 -7
  74. data/samples/elaborate/login.rb +25 -21
  75. data/samples/elaborate/mandelbrot_fractal.rb +346 -39
  76. data/samples/elaborate/meta_sample.rb +1 -1
  77. data/samples/elaborate/tetris.rb +1 -0
  78. data/samples/elaborate/tic_tac_toe.rb +16 -14
  79. data/samples/elaborate/tic_tac_toe/board.rb +5 -5
  80. data/samples/elaborate/tic_tac_toe/cell.rb +5 -5
  81. data/samples/hello/hello_button.rb +7 -7
  82. data/samples/hello/hello_canvas.rb +145 -41
  83. data/samples/hello/hello_checkbox.rb +16 -14
  84. data/samples/hello/hello_checkbox_group.rb +11 -9
  85. data/samples/hello/hello_color_dialog.rb +66 -0
  86. data/samples/hello/hello_combo.rb +14 -12
  87. data/samples/hello/hello_computed.rb +7 -7
  88. data/samples/hello/hello_cursor.rb +58 -0
  89. data/samples/hello/hello_custom_shell.rb +17 -21
  90. data/samples/hello/hello_custom_widget.rb +4 -6
  91. data/samples/hello/hello_date_time.rb +14 -12
  92. data/samples/hello/hello_directory_dialog.rb +7 -7
  93. data/samples/hello/hello_expand_bar.rb +8 -8
  94. data/samples/hello/hello_file_dialog.rb +7 -7
  95. data/samples/hello/hello_font_dialog.rb +82 -0
  96. data/samples/hello/hello_group.rb +18 -16
  97. data/samples/hello/hello_list_multi_selection.rb +13 -11
  98. data/samples/hello/hello_list_single_selection.rb +13 -11
  99. data/samples/hello/hello_progress_bar.rb +125 -0
  100. data/samples/hello/hello_radio.rb +18 -16
  101. data/samples/hello/hello_radio_group.rb +14 -12
  102. data/samples/hello/hello_spinner.rb +7 -7
  103. data/samples/hello/hello_tab.rb +5 -5
  104. data/samples/hello/hello_table.rb +10 -5
  105. data/samples/hello/hello_tree.rb +485 -0
  106. metadata +30 -23
  107. data/lib/glimmer/swt/directory_dialog_proxy.rb +0 -65
  108. data/lib/glimmer/swt/file_dialog_proxy.rb +0 -66
@@ -2,22 +2,28 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: glimmer-dsl-swt 4.18.4.8 ruby lib
5
+ # stub: glimmer-dsl-swt 4.18.5.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "glimmer-dsl-swt".freeze
9
- s.version = "4.18.4.8"
9
+ s.version = "4.18.5.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["AndyMaleh".freeze]
14
- s.date = "2021-02-11"
14
+ s.date = "2021-02-23"
15
15
  s.description = "Glimmer DSL for SWT (JRuby Desktop Development GUI Framework) is a native-GUI cross-platform desktop development library written in JRuby, an OS-threaded faster JVM version of Ruby. Glimmer's main innovation is a declarative Ruby DSL that enables productive and efficient authoring of desktop application user-interfaces by relying on the robust Eclipse SWT library. Glimmer additionally innovates by having built-in data-binding support, which greatly facilitates synchronizing the GUI with domain models, thus achieving true decoupling of object oriented components and enabling developers to solve business problems (test-first) without worrying about GUI concerns, or alternatively drive development GUI-first, and then write clean business models (test-first) afterwards. Not only does Glimmer provide a large set of GUI widgets, but it also supports drawing Canvas Graphics like Shapes and Animations. To get started quickly, Glimmer offers scaffolding options for Apps, Gems, and Custom Widgets. Glimmer also includes native-executable packaging support, sorely lacking in other libraries, thus enabling the delivery of desktop apps written in Ruby as truly native DMG/PKG/APP files on the Mac + App Store, MSI/EXE files on Windows, and Gem Packaged Shell Scripts on Linux.".freeze
16
16
  s.email = "andy.am@gmail.com".freeze
17
17
  s.executables = ["glimmer".freeze, "girb".freeze]
18
18
  s.extra_rdoc_files = [
19
- "LICENSE.txt",
20
- "README.md"
19
+ "README.md",
20
+ "docs/reference/GLIMMER_COMMAND.md",
21
+ "docs/reference/GLIMMER_CONFIGURATION.md",
22
+ "docs/reference/GLIMMER_GIRB.md",
23
+ "docs/reference/GLIMMER_GUI_DSL_SYNTAX.md",
24
+ "docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md",
25
+ "docs/reference/GLIMMER_SAMPLES.md",
26
+ "docs/reference/GLIMMER_STYLE_GUIDE.md"
21
27
  ]
22
28
  s.files = [
23
29
  "CHANGELOG.md",
@@ -52,6 +58,7 @@ Gem::Specification.new do |s|
52
58
  "lib/glimmer/data_binding/widget_binding.rb",
53
59
  "lib/glimmer/dsl/swt/animation_expression.rb",
54
60
  "lib/glimmer/dsl/swt/async_exec_expression.rb",
61
+ "lib/glimmer/dsl/swt/auto_exec_expression.rb",
55
62
  "lib/glimmer/dsl/swt/bind_expression.rb",
56
63
  "lib/glimmer/dsl/swt/block_property_expression.rb",
57
64
  "lib/glimmer/dsl/swt/checkbox_group_selection_data_binding_expression.rb",
@@ -62,13 +69,11 @@ Gem::Specification.new do |s|
62
69
  "lib/glimmer/dsl/swt/custom_widget_expression.rb",
63
70
  "lib/glimmer/dsl/swt/data_binding_expression.rb",
64
71
  "lib/glimmer/dsl/swt/dialog_expression.rb",
65
- "lib/glimmer/dsl/swt/directory_dialog_expression.rb",
66
72
  "lib/glimmer/dsl/swt/display_expression.rb",
67
73
  "lib/glimmer/dsl/swt/dnd_expression.rb",
68
74
  "lib/glimmer/dsl/swt/dsl.rb",
69
75
  "lib/glimmer/dsl/swt/exec_expression.rb",
70
76
  "lib/glimmer/dsl/swt/expand_item_expression.rb",
71
- "lib/glimmer/dsl/swt/file_dialog_expression.rb",
72
77
  "lib/glimmer/dsl/swt/font_expression.rb",
73
78
  "lib/glimmer/dsl/swt/image_expression.rb",
74
79
  "lib/glimmer/dsl/swt/layout_data_expression.rb",
@@ -109,12 +114,21 @@ Gem::Specification.new do |s|
109
114
  "lib/glimmer/swt/custom/drawable.rb",
110
115
  "lib/glimmer/swt/custom/radio_group.rb",
111
116
  "lib/glimmer/swt/custom/shape.rb",
117
+ "lib/glimmer/swt/custom/shape/arc.rb",
118
+ "lib/glimmer/swt/custom/shape/focus.rb",
119
+ "lib/glimmer/swt/custom/shape/image.rb",
120
+ "lib/glimmer/swt/custom/shape/line.rb",
121
+ "lib/glimmer/swt/custom/shape/oval.rb",
122
+ "lib/glimmer/swt/custom/shape/point.rb",
123
+ "lib/glimmer/swt/custom/shape/polygon.rb",
124
+ "lib/glimmer/swt/custom/shape/polyline.rb",
125
+ "lib/glimmer/swt/custom/shape/rectangle.rb",
126
+ "lib/glimmer/swt/custom/shape/text.rb",
112
127
  "lib/glimmer/swt/date_time_proxy.rb",
113
- "lib/glimmer/swt/directory_dialog_proxy.rb",
128
+ "lib/glimmer/swt/dialog_proxy.rb",
114
129
  "lib/glimmer/swt/display_proxy.rb",
115
130
  "lib/glimmer/swt/dnd_proxy.rb",
116
131
  "lib/glimmer/swt/expand_item_proxy.rb",
117
- "lib/glimmer/swt/file_dialog_proxy.rb",
118
132
  "lib/glimmer/swt/font_proxy.rb",
119
133
  "lib/glimmer/swt/image_proxy.rb",
120
134
  "lib/glimmer/swt/layout_data_proxy.rb",
@@ -123,6 +137,7 @@ Gem::Specification.new do |s|
123
137
  "lib/glimmer/swt/message_box_proxy.rb",
124
138
  "lib/glimmer/swt/packages.rb",
125
139
  "lib/glimmer/swt/properties.rb",
140
+ "lib/glimmer/swt/proxy_properties.rb",
126
141
  "lib/glimmer/swt/sash_form_proxy.rb",
127
142
  "lib/glimmer/swt/scrolled_composite_proxy.rb",
128
143
  "lib/glimmer/swt/shell_proxy.rb",
@@ -136,6 +151,7 @@ Gem::Specification.new do |s|
136
151
  "lib/glimmer/swt/tree_proxy.rb",
137
152
  "lib/glimmer/swt/widget_listener_proxy.rb",
138
153
  "lib/glimmer/swt/widget_proxy.rb",
154
+ "lib/glimmer/ui.rb",
139
155
  "lib/glimmer/ui/custom_shell.rb",
140
156
  "lib/glimmer/ui/custom_widget.rb",
141
157
  "lib/glimmer/util/proc_tracker.rb",
@@ -168,9 +184,11 @@ Gem::Specification.new do |s|
168
184
  "samples/hello/hello_checkbox.rb",
169
185
  "samples/hello/hello_checkbox_group.rb",
170
186
  "samples/hello/hello_code_text.rb",
187
+ "samples/hello/hello_color_dialog.rb",
171
188
  "samples/hello/hello_combo.rb",
172
189
  "samples/hello/hello_computed.rb",
173
190
  "samples/hello/hello_computed/contact.rb",
191
+ "samples/hello/hello_cursor.rb",
174
192
  "samples/hello/hello_custom_shell.rb",
175
193
  "samples/hello/hello_custom_widget.rb",
176
194
  "samples/hello/hello_date_time.rb",
@@ -179,6 +197,7 @@ Gem::Specification.new do |s|
179
197
  "samples/hello/hello_drag_and_drop.rb",
180
198
  "samples/hello/hello_expand_bar.rb",
181
199
  "samples/hello/hello_file_dialog.rb",
200
+ "samples/hello/hello_font_dialog.rb",
182
201
  "samples/hello/hello_group.rb",
183
202
  "samples/hello/hello_link.rb",
184
203
  "samples/hello/hello_list_multi_selection.rb",
@@ -186,6 +205,7 @@ Gem::Specification.new do |s|
186
205
  "samples/hello/hello_menu_bar.rb",
187
206
  "samples/hello/hello_message_box.rb",
188
207
  "samples/hello/hello_pop_up_context_menu.rb",
208
+ "samples/hello/hello_progress_bar.rb",
189
209
  "samples/hello/hello_radio.rb",
190
210
  "samples/hello/hello_radio_group.rb",
191
211
  "samples/hello/hello_sash_form.rb",
@@ -194,6 +214,7 @@ Gem::Specification.new do |s|
194
214
  "samples/hello/hello_tab.rb",
195
215
  "samples/hello/hello_table.rb",
196
216
  "samples/hello/hello_table/baseball_park.png",
217
+ "samples/hello/hello_tree.rb",
197
218
  "samples/hello/hello_world.rb",
198
219
  "vendor/swt/linux/swt.jar",
199
220
  "vendor/swt/mac/swt.jar",
@@ -209,12 +230,11 @@ Gem::Specification.new do |s|
209
230
  s.specification_version = 4
210
231
 
211
232
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
212
- s.add_runtime_dependency(%q<glimmer>.freeze, ["~> 1.1.1"])
233
+ s.add_runtime_dependency(%q<glimmer>.freeze, ["~> 1.1.2"])
213
234
  s.add_runtime_dependency(%q<super_module>.freeze, [">= 1.4.1", "< 2.0.0"])
214
235
  s.add_runtime_dependency(%q<nested_inherited_jruby_include_package>.freeze, [">= 0.3.0", "< 2.0.0"])
215
236
  s.add_runtime_dependency(%q<puts_debuggerer>.freeze, [">= 0.11.0", "< 2.0.0"])
216
237
  s.add_runtime_dependency(%q<rake-tui>.freeze, [">= 0.2.3", "< 2.0.0"])
217
- s.add_runtime_dependency(%q<git>.freeze, ["= 1.8.1"])
218
238
  s.add_runtime_dependency(%q<logging>.freeze, [">= 2.3.0", "< 3.0.0"])
219
239
  s.add_runtime_dependency(%q<os>.freeze, [">= 1.0.0", "< 2.0.0"])
220
240
  s.add_runtime_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
@@ -228,12 +248,11 @@ Gem::Specification.new do |s|
228
248
  s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.16.1"])
229
249
  s.add_development_dependency(%q<simplecov-lcov>.freeze, ["~> 0.7.0"])
230
250
  else
231
- s.add_dependency(%q<glimmer>.freeze, ["~> 1.1.1"])
251
+ s.add_dependency(%q<glimmer>.freeze, ["~> 1.1.2"])
232
252
  s.add_dependency(%q<super_module>.freeze, [">= 1.4.1", "< 2.0.0"])
233
253
  s.add_dependency(%q<nested_inherited_jruby_include_package>.freeze, [">= 0.3.0", "< 2.0.0"])
234
254
  s.add_dependency(%q<puts_debuggerer>.freeze, [">= 0.11.0", "< 2.0.0"])
235
255
  s.add_dependency(%q<rake-tui>.freeze, [">= 0.2.3", "< 2.0.0"])
236
- s.add_dependency(%q<git>.freeze, ["= 1.8.1"])
237
256
  s.add_dependency(%q<logging>.freeze, [">= 2.3.0", "< 3.0.0"])
238
257
  s.add_dependency(%q<os>.freeze, [">= 1.0.0", "< 2.0.0"])
239
258
  s.add_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
@@ -248,12 +267,11 @@ Gem::Specification.new do |s|
248
267
  s.add_dependency(%q<simplecov-lcov>.freeze, ["~> 0.7.0"])
249
268
  end
250
269
  else
251
- s.add_dependency(%q<glimmer>.freeze, ["~> 1.1.1"])
270
+ s.add_dependency(%q<glimmer>.freeze, ["~> 1.1.2"])
252
271
  s.add_dependency(%q<super_module>.freeze, [">= 1.4.1", "< 2.0.0"])
253
272
  s.add_dependency(%q<nested_inherited_jruby_include_package>.freeze, [">= 0.3.0", "< 2.0.0"])
254
273
  s.add_dependency(%q<puts_debuggerer>.freeze, [">= 0.11.0", "< 2.0.0"])
255
274
  s.add_dependency(%q<rake-tui>.freeze, [">= 0.2.3", "< 2.0.0"])
256
- s.add_dependency(%q<git>.freeze, ["= 1.8.1"])
257
275
  s.add_dependency(%q<logging>.freeze, [">= 2.3.0", "< 3.0.0"])
258
276
  s.add_dependency(%q<os>.freeze, [">= 1.0.0", "< 2.0.0"])
259
277
  s.add_dependency(%q<rake>.freeze, [">= 10.1.0", "< 14.0.0"])
@@ -32,8 +32,7 @@ module Glimmer
32
32
  'org.eclipse.swt.custom',
33
33
  'org.eclipse.swt.dnd',
34
34
  ]
35
- DEFAULT_AUTO_SYNC_EXEC = false
36
- GUI_THREAD = Thread.current
35
+ DEFAULT_AUTO_SYNC_EXEC = true
37
36
 
38
37
  class << self
39
38
  # Tells Glimmer to import SWT packages into including class (default: true)
@@ -59,10 +58,6 @@ module Glimmer
59
58
  end
60
59
  alias auto_sync_exec? auto_sync_exec
61
60
 
62
- def require_sync_exec?
63
- Thread.current != GUI_THREAD
64
- end
65
-
66
61
  # Returns Logging Devices. Default is [:stdout, :syslog]
67
62
  def logging_devices
68
63
  unless defined? @@logging_devices
@@ -147,9 +142,10 @@ end
147
142
  Glimmer::Config.reset_logger! unless ENV['GLIMMER_LOGGER_ENABLED'].to_s.downcase == 'false'
148
143
  if ENV['GLIMMER_LOGGER_LEVEL']
149
144
  # if glimmer log level is being overridden for debugging purposes, then disable async logging making logging immediate
150
- Glimmer::Config.logging_appender_options = Glimmer::Config.logging_appender_options.merge(async: false, auto_flushing: 1)
145
+ Glimmer::Config.logging_appender_options = Glimmer::Config.logging_appender_options.merge(async: false, auto_flushing: 1, immediate_at: [:unknown, :debug, :info, :error, :fatal])
151
146
  Glimmer::Config.logging_devices = [:stdout]
152
147
  begin
148
+ puts "Adjusting Glimmer logging level to #{ENV['GLIMMER_LOGGER_LEVEL']}"
153
149
  Glimmer::Config.logger.level = ENV['GLIMMER_LOGGER_LEVEL'].strip
154
150
  rescue => e
155
151
  puts e.message
@@ -1,5 +1,5 @@
1
1
  # Copyright (c) 2007-2021 Andy Maleh
2
- #
2
+ #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining
4
4
  # a copy of this software and associated documentation files (the
5
5
  # "Software"), to deal in the Software without restriction, including
@@ -7,10 +7,10 @@
7
7
  # distribute, sublicense, and/or sell copies of the Software, and to
8
8
  # permit persons to whom the Software is furnished to do so, subject to
9
9
  # the following conditions:
10
- #
10
+ #
11
11
  # The above copyright notice and this permission notice shall be
12
12
  # included in all copies or substantial portions of the Software.
13
- #
13
+ #
14
14
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
15
  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
16
  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -50,17 +50,23 @@ module Glimmer
50
50
  # Initialize with list widget and property_type
51
51
  # property_type :string represents default list single selection
52
52
  # property_type :array represents list multi selection
53
- def initialize(widget_proxy, property_type)
53
+ def initialize(widget_proxy, property_type, sync_exec: false, async_exec: false)
54
54
  property_type = :string if property_type.nil? or property_type == :undefined
55
55
  @widget_proxy = widget_proxy
56
56
  @property_type = property_type
57
- @widget_proxy.on_widget_disposed do |dispose_event|
58
- unregister_all_observables
57
+ @sync_exec = sync_exec
58
+ @async_exec = async_exec
59
+ Glimmer::SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @sync_exec, override_async_exec: @async_exec) do
60
+ @widget_proxy.on_widget_disposed do |dispose_event|
61
+ unregister_all_observables
62
+ end
59
63
  end
60
64
  end
61
65
 
62
66
  def call(value)
63
- PROPERTY_TYPE_UPDATERS[@property_type].call(@widget_proxy, value) unless evaluate_property == value
67
+ Glimmer::SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @sync_exec, override_async_exec: @async_exec) do
68
+ PROPERTY_TYPE_UPDATERS[@property_type].call(@widget_proxy, value) unless evaluate_property == value
69
+ end
64
70
  end
65
71
 
66
72
  def evaluate_property
@@ -24,6 +24,7 @@ require 'glimmer/data_binding/observable_model'
24
24
  require 'glimmer/data_binding/observable'
25
25
  require 'glimmer/data_binding/observer'
26
26
  require 'glimmer/swt/swt_proxy'
27
+ require 'glimmer/swt/display_proxy'
27
28
 
28
29
  module Glimmer
29
30
  module DataBinding
@@ -37,33 +38,37 @@ module Glimmer
37
38
  @table = parent
38
39
  @model_binding = model_binding
39
40
  @read_only_sort = @model_binding.binding_options[:read_only_sort]
40
- @table.swt_widget.data = @model_binding
41
- @table.swt_widget.set_data('table_items_binding', self)
42
41
  @column_properties = column_properties
43
- @table.on_widget_disposed do |dispose_event|
44
- unregister_all_observables
45
- end
46
42
  if @table.respond_to?(:column_properties=)
47
43
  @table.column_properties = @column_properties
48
44
  else # assume custom widget
49
45
  @table.body_root.column_properties = @column_properties
50
46
  end
51
- @table_observer_registration = observe(model_binding)
52
- call
47
+ Glimmer::SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @model_binding.binding_options[:sync_exec], override_async_exec: @model_binding.binding_options[:async_exec]) do
48
+ @table.swt_widget.data = @model_binding
49
+ @table.swt_widget.set_data('table_items_binding', self)
50
+ @table.on_widget_disposed do |dispose_event|
51
+ unregister_all_observables
52
+ end
53
+ @table_observer_registration = observe(model_binding)
54
+ call
55
+ end
53
56
  end
54
57
 
55
58
  def call(new_model_collection=nil, internal_sort: false)
56
- new_model_collection = model_binding_evaluated_property = @model_binding.evaluate_property unless internal_sort # this ensures applying converters (e.g. :on_read)
57
- table_cells = @table.swt_widget.items.map {|item| @table.column_properties.size.times.map {|i| item.get_text(i)} }
58
- model_cells = new_model_collection.to_a.map {|m| @table.cells_for(m)}
59
- return if table_cells == model_cells
60
- if new_model_collection and new_model_collection.is_a?(Array)
61
- @table_items_observer_registration&.unobserve
62
- @table_items_observer_registration = observe(new_model_collection, @column_properties)
63
- add_dependent(@table_observer_registration => @table_items_observer_registration)
64
- @model_collection = new_model_collection
59
+ Glimmer::SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @model_binding.binding_options[:sync_exec], override_async_exec: @model_binding.binding_options[:async_exec]) do
60
+ new_model_collection = model_binding_evaluated_property = @model_binding.evaluate_property unless internal_sort # this ensures applying converters (e.g. :on_read)
61
+ table_cells = @table.swt_widget.items.map {|item| @table.column_properties.size.times.map {|i| item.get_text(i)} }
62
+ model_cells = new_model_collection.to_a.map {|m| @table.cells_for(m)}
63
+ return if table_cells == model_cells
64
+ if new_model_collection and new_model_collection.is_a?(Array)
65
+ @table_items_observer_registration&.unobserve
66
+ @table_items_observer_registration = observe(new_model_collection, @column_properties)
67
+ add_dependent(@table_observer_registration => @table_items_observer_registration)
68
+ @model_collection = new_model_collection
69
+ end
70
+ populate_table(@model_collection, @table, @column_properties, internal_sort: internal_sort)
65
71
  end
66
- populate_table(@model_collection, @table, @column_properties, internal_sort: internal_sort)
67
72
  end
68
73
 
69
74
  def populate_table(model_collection, parent, column_properties, internal_sort: false)
@@ -43,29 +43,33 @@ module Glimmer
43
43
  else # assume custom widget
44
44
  @tree.body_root.tree_properties = @tree_properties
45
45
  end
46
- call
47
- model = model_binding.base_model
48
- observe(model, model_binding.property_name_expression)
49
- @tree.on_widget_disposed do |dispose_event|
50
- unregister_all_observables
46
+ Glimmer::SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @model_binding.binding_options[:sync_exec], override_async_exec: @model_binding.binding_options[:async_exec]) do
47
+ call
48
+ model = model_binding.base_model
49
+ observe(model, model_binding.property_name_expression)
50
+ @tree.on_widget_disposed do |dispose_event|
51
+ unregister_all_observables
52
+ end
51
53
  end
52
54
  end
53
55
 
54
56
  def call(new_value=nil)
55
- @model_tree_root_node = @model_binding.evaluate_property
56
- old_tree_items = @tree.all_tree_items
57
- old_model_tree_nodes = old_tree_items.map(&:get_data)
58
- new_model_tree_nodes = []
59
- recursive_depth_first_search(@model_tree_root_node, @tree_properties, new_model_tree_nodes)
60
- return if old_model_tree_nodes == new_model_tree_nodes && old_tree_items.map(&:text) == new_model_tree_nodes.map {|model_tree_node| model_tree_node.send(@tree_properties[:text])}
61
- populate_tree(@model_tree_root_node, @tree, @tree_properties)
57
+ Glimmer::SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @model_binding.binding_options[:sync_exec], override_async_exec: @model_binding.binding_options[:async_exec]) do
58
+ @model_tree_root_node = @model_binding.evaluate_property
59
+ old_tree_items = @tree.all_tree_items
60
+ old_model_tree_nodes = old_tree_items.map(&:get_data)
61
+ new_model_tree_nodes = []
62
+ recursive_depth_first_search(@model_tree_root_node, @tree_properties, new_model_tree_nodes)
63
+ return if old_model_tree_nodes == new_model_tree_nodes && old_tree_items.map(&:text) == new_model_tree_nodes.map {|model_tree_node| model_tree_node.send(@tree_properties[:text])}
64
+ populate_tree(@model_tree_root_node, @tree, @tree_properties)
65
+ end
62
66
  end
63
67
 
64
68
  def populate_tree(model_tree_root_node, parent, tree_properties)
65
69
  # TODO get rid of model_tree_root_node, parent, tree_properties as an argument given it is stored as an instance variable
66
70
  # TODO make it change things by delta instead of removing all
67
71
  old_tree_items = parent.all_tree_items
68
- selected_tree_item_model = parent.swt_widget.getSelection.map(&:get_data).first
72
+ selected_tree_item_models = parent.swt_widget.getSelection.map(&:get_data)
69
73
  old_tree_item_expansion_by_data = old_tree_items.reduce({}) {|hash, ti| hash.merge(ti.getData => ti.getExpanded)}
70
74
  old_tree_items.each do |tree_item|
71
75
  tree_item.getData('observer_registrations').each(&:unregister)
@@ -74,8 +78,8 @@ module Glimmer
74
78
  parent.swt_widget.removeAll
75
79
  populate_tree_node(model_tree_root_node, parent.swt_widget, tree_properties)
76
80
  parent.all_tree_items.each { |ti| ti.setExpanded(!!old_tree_item_expansion_by_data[ti.getData]) }
77
- tree_item_to_select = parent.depth_first_search {|ti| ti.getData == selected_tree_item_model}
78
- parent.swt_widget.setSelection(tree_item_to_select)
81
+ selected_tree_items = parent.depth_first_search {|item| selected_tree_item_models.include?(item.get_data) }
82
+ parent.swt_widget.setSelection(selected_tree_items)
79
83
  end
80
84
 
81
85
  def populate_tree_node(model_tree_node, parent, tree_properties)
@@ -32,32 +32,30 @@ module Glimmer
32
32
  include Observer
33
33
 
34
34
  attr_reader :widget, :property
35
- def initialize(widget, property, translator = nil)
35
+ def initialize(widget, property, sync_exec: nil, async_exec: nil)
36
36
  @widget = widget
37
37
  @property = property
38
- @translator = translator || proc {|value| value} #TODO check on this it doesn't seem used
39
-
40
- if @widget.respond_to?(:on_widget_disposed)
41
- @widget.on_widget_disposed do |dispose_event|
42
- unregister_all_observables
38
+ @sync_exec = sync_exec
39
+ @async_exec = async_exec
40
+ SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @sync_exec, override_async_exec: @async_exec) do
41
+ if @widget.respond_to?(:on_widget_disposed)
42
+ @widget.on_widget_disposed do |dispose_event|
43
+ unregister_all_observables
44
+ end
43
45
  end
44
46
  end
45
47
  end
46
48
 
47
49
  def call(value)
48
- converted_value = translated_value = @translator.call(value)
49
-
50
- update_operation = lambda do
50
+ SWT::DisplayProxy.instance.auto_exec(override_sync_exec: @sync_exec, override_async_exec: @async_exec) do
51
51
  if @widget.respond_to?(:disposed?) && @widget.disposed?
52
52
  unregister_all_observables
53
53
  return
54
54
  end
55
- @widget.set_attribute(@property, converted_value) unless evaluate_property == converted_value
56
- end
57
- if Config.auto_sync_exec? && Config.require_sync_exec?
58
- SWT::DisplayProxy.instance.sync_exec(&update_operation)
59
- else
60
- update_operation.call
55
+ # need the rescue false for a scenario with tree items not being equal to model objects raising an exception
56
+ unless ((value == evaluate_property) rescue false) # need the rescue false for a scenario with tree items not being equal to model objects raising an exception
57
+ @widget.set_attribute(@property, value)
58
+ end
61
59
  end
62
60
  end
63
61
 
@@ -20,28 +20,16 @@
20
20
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
21
 
22
22
  require 'glimmer/dsl/static_expression'
23
- require 'glimmer/dsl/parent_expression'
24
- require 'glimmer/dsl/top_level_expression'
25
- require 'glimmer/swt/file_dialog_proxy'
23
+ require 'glimmer/dsl/swt/exec_expression'
26
24
 
27
25
  module Glimmer
28
26
  module DSL
29
27
  module SWT
30
- class FileDialogExpression < StaticExpression
31
- include TopLevelExpression
32
- include ParentExpression
33
-
34
- include_package 'org.eclipse.swt.widgets'
35
-
36
- def can_interpret?(parent, keyword, *args, &block)
37
- keyword == 'file_dialog' and
38
- (parent.nil? or parent.is_a?(Shell) or parent.is_a?(Glimmer::SWT::ShellProxy))
39
- end
40
-
41
- def interpret(parent, keyword, *args, &block)
42
- args = [parent] + args unless parent.nil?
43
- Glimmer::SWT::FileDialogProxy.send(:new, *args)
44
- end
28
+ # Automatically executes code block against the SWT Event Loop
29
+ # with sync_exec if needed (inside a thread other than GUI thread)
30
+ # to manipulate SWT UI objects on the UI thread safely
31
+ class AutoExecExpression < StaticExpression
32
+ include ExecExpression
45
33
  end
46
34
  end
47
35
  end