glimmer-dsl-swt 4.17.10.7 → 4.18.1.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.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/LICENSE.txt +1 -1
  4. data/README.md +508 -60
  5. data/RUBY_VERSION +1 -1
  6. data/VERSION +1 -1
  7. data/bin/girb +1 -1
  8. data/bin/girb_runner.rb +1 -1
  9. data/bin/glimmer +1 -1
  10. data/glimmer-dsl-swt.gemspec +58 -30
  11. data/lib/ext/glimmer.rb +1 -1
  12. data/lib/ext/glimmer/config.rb +7 -7
  13. data/lib/glimmer-dsl-swt.rb +3 -1
  14. data/lib/glimmer/Rakefile +1 -1
  15. data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
  16. data/lib/glimmer/data_binding/observable_widget.rb +1 -1
  17. data/lib/glimmer/data_binding/shine.rb +1 -1
  18. data/lib/glimmer/data_binding/table_items_binding.rb +1 -1
  19. data/lib/glimmer/data_binding/tree_items_binding.rb +1 -1
  20. data/lib/glimmer/data_binding/widget_binding.rb +1 -1
  21. data/lib/glimmer/dsl/swt/animation_expression.rb +43 -0
  22. data/lib/glimmer/dsl/swt/async_exec_expression.rb +1 -1
  23. data/lib/glimmer/dsl/swt/bind_expression.rb +1 -1
  24. data/lib/glimmer/dsl/swt/block_property_expression.rb +1 -1
  25. data/lib/glimmer/dsl/swt/checkbox_group_selection_data_binding_expression.rb +1 -1
  26. data/lib/glimmer/dsl/swt/color_expression.rb +1 -1
  27. data/lib/glimmer/dsl/swt/column_properties_expression.rb +1 -1
  28. data/lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb +1 -1
  29. data/lib/glimmer/dsl/swt/cursor_expression.rb +1 -1
  30. data/lib/glimmer/dsl/swt/custom_widget_expression.rb +1 -1
  31. data/lib/glimmer/dsl/swt/data_binding_expression.rb +1 -1
  32. data/lib/glimmer/dsl/swt/dialog_expression.rb +1 -1
  33. data/lib/glimmer/dsl/swt/directory_dialog_expression.rb +1 -1
  34. data/lib/glimmer/dsl/swt/display_expression.rb +1 -1
  35. data/lib/glimmer/dsl/swt/dnd_expression.rb +1 -1
  36. data/lib/glimmer/dsl/swt/dsl.rb +5 -4
  37. data/lib/glimmer/dsl/swt/exec_expression.rb +5 -5
  38. data/lib/glimmer/dsl/swt/expand_item_expression.rb +1 -1
  39. data/lib/glimmer/dsl/swt/file_dialog_expression.rb +1 -1
  40. data/lib/glimmer/dsl/swt/font_expression.rb +8 -6
  41. data/lib/glimmer/dsl/swt/image_expression.rb +1 -1
  42. data/lib/glimmer/dsl/swt/layout_data_expression.rb +1 -1
  43. data/lib/glimmer/dsl/swt/layout_expression.rb +1 -1
  44. data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +1 -1
  45. data/lib/glimmer/dsl/swt/menu_bar_expression.rb +1 -1
  46. data/lib/glimmer/dsl/swt/menu_expression.rb +1 -1
  47. data/lib/glimmer/dsl/swt/message_box_expression.rb +1 -1
  48. data/lib/glimmer/dsl/swt/observe_expression.rb +1 -1
  49. data/lib/glimmer/dsl/swt/property_expression.rb +4 -4
  50. data/lib/glimmer/dsl/swt/radio_group_selection_data_binding_expression.rb +1 -1
  51. data/lib/glimmer/dsl/swt/rgb_expression.rb +1 -1
  52. data/lib/glimmer/dsl/swt/rgba_expression.rb +1 -1
  53. data/lib/glimmer/dsl/swt/shape_expression.rb +56 -0
  54. data/lib/glimmer/dsl/swt/shell_expression.rb +1 -1
  55. data/lib/glimmer/dsl/swt/swt_expression.rb +1 -1
  56. data/lib/glimmer/dsl/swt/sync_exec_expression.rb +1 -1
  57. data/lib/glimmer/dsl/swt/tab_item_expression.rb +1 -1
  58. data/lib/glimmer/dsl/swt/table_items_data_binding_expression.rb +1 -1
  59. data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +1 -1
  60. data/lib/glimmer/dsl/swt/tree_properties_expression.rb +1 -1
  61. data/lib/glimmer/dsl/swt/widget_expression.rb +7 -3
  62. data/lib/glimmer/dsl/swt/widget_listener_expression.rb +1 -1
  63. data/lib/glimmer/launcher.rb +1 -1
  64. data/lib/glimmer/rake_task.rb +1 -1
  65. data/lib/glimmer/rake_task/list.rb +1 -1
  66. data/lib/glimmer/rake_task/package.rb +1 -1
  67. data/lib/glimmer/rake_task/scaffold.rb +1 -1
  68. data/lib/glimmer/swt/color_proxy.rb +1 -1
  69. data/lib/glimmer/swt/cursor_proxy.rb +1 -1
  70. data/lib/glimmer/swt/custom/animation.rb +116 -0
  71. data/lib/glimmer/swt/custom/checkbox_group.rb +1 -1
  72. data/lib/glimmer/swt/custom/drawable.rb +43 -0
  73. data/lib/glimmer/swt/custom/radio_group.rb +1 -1
  74. data/lib/glimmer/swt/custom/shape.rb +135 -0
  75. data/lib/glimmer/swt/date_time_proxy.rb +1 -1
  76. data/lib/glimmer/swt/directory_dialog_proxy.rb +1 -1
  77. data/lib/glimmer/swt/display_proxy.rb +16 -1
  78. data/lib/glimmer/swt/dnd_proxy.rb +1 -1
  79. data/lib/glimmer/swt/expand_item_proxy.rb +1 -1
  80. data/lib/glimmer/swt/file_dialog_proxy.rb +1 -1
  81. data/lib/glimmer/swt/font_proxy.rb +4 -4
  82. data/lib/glimmer/swt/image_proxy.rb +12 -11
  83. data/lib/glimmer/swt/layout_data_proxy.rb +1 -1
  84. data/lib/glimmer/swt/layout_proxy.rb +8 -4
  85. data/lib/glimmer/swt/menu_proxy.rb +10 -5
  86. data/lib/glimmer/swt/message_box_proxy.rb +1 -1
  87. data/lib/glimmer/swt/packages.rb +1 -1
  88. data/lib/glimmer/swt/properties.rb +49 -0
  89. data/lib/glimmer/swt/sash_form_proxy.rb +2 -2
  90. data/lib/glimmer/swt/scrolled_composite_proxy.rb +1 -1
  91. data/lib/glimmer/swt/shell_proxy.rb +3 -2
  92. data/lib/glimmer/swt/style_constantizable.rb +9 -5
  93. data/lib/glimmer/swt/styled_text_proxy.rb +1 -1
  94. data/lib/glimmer/swt/swt_proxy.rb +1 -1
  95. data/lib/glimmer/swt/tab_item_proxy.rb +1 -1
  96. data/lib/glimmer/swt/table_column_proxy.rb +1 -1
  97. data/lib/glimmer/swt/table_proxy.rb +1 -1
  98. data/lib/glimmer/swt/tree_proxy.rb +26 -22
  99. data/lib/glimmer/swt/widget_listener_proxy.rb +1 -1
  100. data/lib/glimmer/swt/widget_proxy.rb +54 -28
  101. data/lib/glimmer/ui/custom_shell.rb +1 -1
  102. data/lib/glimmer/ui/custom_widget.rb +1 -1
  103. data/lib/glimmer/util/proc_tracker.rb +1 -1
  104. data/samples/elaborate/contact_manager.rb +1 -1
  105. data/samples/elaborate/contact_manager/contact.rb +1 -1
  106. data/samples/elaborate/contact_manager/contact_manager_presenter.rb +1 -1
  107. data/samples/elaborate/contact_manager/contact_repository.rb +1 -1
  108. data/samples/elaborate/login.rb +1 -1
  109. data/samples/elaborate/meta_sample.rb +80 -20
  110. data/samples/elaborate/tic_tac_toe.rb +2 -2
  111. data/samples/elaborate/tic_tac_toe/board.rb +1 -1
  112. data/samples/elaborate/tic_tac_toe/cell.rb +1 -1
  113. data/samples/elaborate/user_profile.rb +1 -1
  114. data/samples/hello/hello_browser.rb +3 -1
  115. data/samples/hello/hello_button.rb +1 -1
  116. data/samples/hello/hello_canvas.rb +62 -0
  117. data/samples/hello/hello_canvas_animation.rb +66 -0
  118. data/samples/hello/hello_checkbox.rb +1 -1
  119. data/samples/hello/hello_checkbox_group.rb +1 -1
  120. data/samples/hello/hello_combo.rb +1 -1
  121. data/samples/hello/hello_computed.rb +10 -4
  122. data/samples/hello/hello_computed/contact.rb +1 -1
  123. data/samples/hello/hello_custom_shell.rb +1 -1
  124. data/samples/hello/hello_custom_widget.rb +1 -1
  125. data/samples/hello/hello_date_time.rb +1 -1
  126. data/samples/hello/hello_dialog.rb +78 -0
  127. data/samples/hello/hello_directory_dialog.rb +1 -1
  128. data/samples/hello/hello_drag_and_drop.rb +1 -1
  129. data/samples/hello/hello_expand_bar.rb +1 -1
  130. data/samples/hello/hello_file_dialog.rb +1 -1
  131. data/samples/hello/hello_group.rb +1 -1
  132. data/samples/hello/hello_link.rb +1 -1
  133. data/samples/hello/hello_list_multi_selection.rb +1 -1
  134. data/samples/hello/hello_list_single_selection.rb +1 -1
  135. data/samples/hello/hello_menu_bar.rb +185 -29
  136. data/samples/hello/hello_message_box.rb +10 -9
  137. data/samples/hello/hello_pop_up_context_menu.rb +34 -7
  138. data/samples/hello/hello_radio.rb +1 -1
  139. data/samples/hello/hello_radio_group.rb +1 -1
  140. data/samples/hello/hello_sash_form.rb +1 -1
  141. data/samples/hello/hello_spinner.rb +1 -1
  142. data/samples/hello/hello_styled_text.rb +1 -1
  143. data/samples/hello/hello_tab.rb +1 -1
  144. data/samples/hello/hello_table.rb +1 -1
  145. data/samples/hello/hello_world.rb +1 -1
  146. data/vendor/swt/linux/swt.jar +0 -0
  147. data/vendor/swt/mac/swt.jar +0 -0
  148. data/vendor/swt/windows/swt.jar +0 -0
  149. metadata +54 -32
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -0,0 +1,49 @@
1
+ # Copyright (c) 2007-2021 Andy Maleh
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining
4
+ # a copy of this software and associated documentation files (the
5
+ # "Software"), to deal in the Software without restriction, including
6
+ # without limitation the rights to use, copy, modify, merge, publish,
7
+ # distribute, sublicense, and/or sell copies of the Software, and to
8
+ # permit persons to whom the Software is furnished to do so, subject to
9
+ # the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
22
+ module Glimmer
23
+ module SWT
24
+ module Properties
25
+ def ruby_attribute_setter(attribute_name)
26
+ "#{normalized_attribute(attribute_name)}="
27
+ end
28
+
29
+ def attribute_setter(attribute_name)
30
+ "set#{normalized_attribute(attribute_name).camelcase(:upper)}"
31
+ end
32
+
33
+ def attribute_getter(attribute_name)
34
+ "get#{normalized_attribute(attribute_name).camelcase(:upper)}"
35
+ end
36
+
37
+ def normalized_attribute(attribute_name)
38
+ attribute_name = attribute_name.to_s if attribute_name.is_a?(Symbol)
39
+ attribute_name = attribute_name.underscore unless attribute_name.downcase?
40
+ attribute_name = attribute_name.sub(/^get_/, '') if attribute_name.start_with?('get_')
41
+ attribute_name = attribute_name.sub(/^set_/, '') if attribute_name.start_with?('set_')
42
+ attribute_name = attribute_name.sub(/=$/, '') if attribute_name.end_with?('=')
43
+ attribute_name
44
+ end
45
+ alias ruby_attribute_getter normalized_attribute
46
+
47
+ end
48
+ end
49
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -28,7 +28,7 @@ module Glimmer
28
28
  # Follows the Proxy Design Pattern
29
29
  class SashFormProxy < WidgetProxy
30
30
  def post_add_content
31
- swt_widget.setWeights(@weights) unless @weights.nil?
31
+ self.weights = @weights unless @weights.nil?
32
32
  end
33
33
 
34
34
  def set_attribute(attribute_name, *args)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -64,10 +64,11 @@ module Glimmer
64
64
  @swt_widget.setLayout(FillLayout.new)
65
65
  @swt_widget.setMinimumSize(WIDTH_MIN, HEIGHT_MIN)
66
66
  # TODO make this an option not the default
67
+ shell_swt_display = Glimmer::SWT::DisplayProxy.instance.swt_display
67
68
  on_swt_show do
68
69
  Thread.new do
69
70
  sleep(0.25)
70
- async_exec do
71
+ shell_swt_display.async_exec do
71
72
  @swt_widget.setActive unless @swt_widget.isDisposed
72
73
  end
73
74
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -89,11 +89,15 @@ module Glimmer
89
89
  negative ? ~bit_value : bit_value
90
90
  rescue => e
91
91
  # Glimmer::Config.logger.debug {e.full_message}
92
- bit_value = extra_styles[swt_constant_symbol]
93
- if bit_value
94
- negative ? ~bit_value : bit_value
92
+ if symbol.to_s.size == 1 # accelerator key
93
+ symbol.to_s.bytes.first
95
94
  else
96
- symbol
95
+ bit_value = extra_styles[swt_constant_symbol]
96
+ if bit_value
97
+ negative ? ~bit_value : bit_value
98
+ else
99
+ symbol
100
+ end
97
101
  end
98
102
  end
99
103
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,5 +1,5 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
2
- #
1
+ # Copyright (c) 2007-2021 Andy Maleh
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
@@ -59,7 +59,7 @@ module Glimmer
59
59
  observer.call(@swt_widget.getSelection)
60
60
  }
61
61
  end
62
- },
62
+ },
63
63
  })
64
64
  end
65
65
 
@@ -85,24 +85,28 @@ module Glimmer
85
85
  @edit_in_progress = false
86
86
  }
87
87
  action = lambda { |event|
88
- if !action_taken && !@edit_in_progress
89
- action_taken = true
90
- @edit_in_progress = true
91
- new_text = @tree_editor_text_proxy.swt_widget.getText
92
- if new_text == tree_item.getText
93
- cancel.call
94
- else
95
- before_write&.call
96
- tree_item.setText(new_text)
97
- model = tree_item.getData
98
- model.send("#{tree_properties[:text]}=", new_text) # makes tree update itself, so must search for selected tree item again
99
- edited_tree_item = depth_first_search { |ti| ti.getData == model }.first
100
- swt_widget.showItem(edited_tree_item)
101
- @tree_editor_text_proxy.swt_widget.dispose
102
- @tree_editor_text_proxy = nil
103
- after_write&.call(edited_tree_item)
104
- @edit_in_progress = false
88
+ begin
89
+ if !action_taken && !@edit_in_progress
90
+ action_taken = true
91
+ @edit_in_progress = true
92
+ new_text = @tree_editor_text_proxy.swt_widget.getText
93
+ if new_text == tree_item.getText
94
+ cancel.call
95
+ else
96
+ before_write&.call
97
+ tree_item.setText(new_text)
98
+ model = tree_item.getData
99
+ model.send("#{tree_properties[:text]}=", new_text) # makes tree update itself, so must search for selected tree item again
100
+ edited_tree_item = depth_first_search { |ti| ti.getData == model }.first
101
+ swt_widget.showItem(edited_tree_item)
102
+ @tree_editor_text_proxy.swt_widget.dispose
103
+ @tree_editor_text_proxy = nil
104
+ after_write&.call(edited_tree_item)
105
+ @edit_in_progress = false
106
+ end
105
107
  end
108
+ rescue => e
109
+ Glimmer::Config.logger.error {"Error encountered while editing tree item!\n#{e.full_message}"}
106
110
  end
107
111
  }
108
112
  on_focus_lost(&action)
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -26,6 +26,8 @@ require 'glimmer/swt/swt_proxy'
26
26
  require 'glimmer/swt/display_proxy'
27
27
  require 'glimmer/swt/dnd_proxy'
28
28
  require 'glimmer/swt/image_proxy'
29
+ require 'glimmer/swt/properties'
30
+ require 'glimmer/swt/custom/drawable'
29
31
 
30
32
  # TODO refactor to make file smaller and extract sub-widget-proxies out of this
31
33
 
@@ -42,6 +44,8 @@ module Glimmer
42
44
  # Follows the Proxy Design Pattern
43
45
  class WidgetProxy
44
46
  include Packages
47
+ include Properties
48
+ include Custom::Drawable
45
49
 
46
50
  DEFAULT_STYLES = {
47
51
  'arrow' => [:arrow],
@@ -202,7 +206,22 @@ module Glimmer
202
206
  end
203
207
  end
204
208
 
209
+ def has_attribute_getter?(attribute_getter_name, *args)
210
+ attribute_getter_name = attribute_getter_name.to_s.underscore
211
+ return false unless !attribute_getter_name.end_with?('=') && !attribute_getter_name.start_with?('set_')
212
+ args.empty? && swt_widget.respond_to?(attribute_getter_name)
213
+ end
214
+
215
+ def has_attribute_setter?(attribute_setter_name, *args)
216
+ attribute_setter_name = attribute_setter_name.to_s
217
+ underscored_attribute_setter_name = attribute_setter_name.underscore
218
+ return false unless attribute_setter_name.end_with?('=') || (attribute_setter_name.start_with?('set_') && !args.empty?)
219
+ attribute_name = underscored_attribute_setter_name.sub(/^set_/, '').sub(/=$/, '')
220
+ has_attribute?(attribute_name, *args)
221
+ end
222
+
205
223
  def has_attribute?(attribute_name, *args)
224
+ # TODO test that attribute getter responds too
206
225
  widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
207
226
  if widget_custom_attribute
208
227
  @swt_widget.respond_to?(widget_custom_attribute[:setter][:name])
@@ -214,11 +233,13 @@ module Glimmer
214
233
  def set_attribute(attribute_name, *args)
215
234
  # TODO Think about widget subclasses overriding set_attribute to add more attributes vs adding as Ruby attributes directly
216
235
  widget_custom_attribute = widget_custom_attribute_mapping[attribute_name.to_s]
236
+ apply_property_type_converters(normalized_attribute(attribute_name), args)
217
237
  if widget_custom_attribute
218
238
  widget_custom_attribute[:setter][:invoker].call(@swt_widget, args)
219
239
  elsif @swt_widget.respond_to?(attribute_setter(attribute_name))
220
- apply_property_type_converters(attribute_name, args)
221
240
  @swt_widget.send(attribute_setter(attribute_name), *args) unless @swt_widget.send(attribute_getter(attribute_name)) == args.first
241
+ elsif @swt_widget.respond_to?(ruby_attribute_setter(attribute_name))
242
+ @swt_widget.send(ruby_attribute_setter(attribute_name), args)
222
243
  else
223
244
  send(ruby_attribute_setter(attribute_name), args)
224
245
  end
@@ -234,6 +255,12 @@ module Glimmer
234
255
  end
235
256
  elsif @swt_widget.respond_to?(attribute_getter(attribute_name))
236
257
  @swt_widget.send(attribute_getter(attribute_name))
258
+ elsif @swt_widget.respond_to?(ruby_attribute_getter(attribute_name))
259
+ @swt_widget.send(ruby_attribute_getter(attribute_name))
260
+ elsif @swt_widget.respond_to?(attribute_name)
261
+ @swt_widget.send(attribute_name)
262
+ elsif respond_to?(ruby_attribute_getter(attribute_name))
263
+ send(ruby_attribute_getter(attribute_name))
237
264
  else
238
265
  send(attribute_name)
239
266
  end
@@ -608,11 +635,16 @@ module Glimmer
608
635
  def method_missing(method, *args, &block)
609
636
  if can_handle_observation_request?(method)
610
637
  handle_observation_request(method, &block)
638
+ elsif has_attribute_setter?(method, *args)
639
+ set_attribute(method, *args)
640
+ elsif has_attribute_getter?(method, *args)
641
+ get_attribute(method, *args)
611
642
  else
612
643
  swt_widget.send(method, *args, &block)
613
644
  end
614
645
  rescue => e
615
- Glimmer::Config.logger.debug {"Neither WidgetProxy nor #{swt_widget.class.name} can handle the method ##{method}"}
646
+ Glimmer::Config.logger.debug { "Neither WidgetProxy nor #{swt_widget.class.name} can handle the method ##{method}" }
647
+ Glimmer::Config.logger.debug { e.full_message }
616
648
  super
617
649
  # TODO consider get_attribute too
618
650
  end
@@ -639,18 +671,6 @@ module Glimmer
639
671
  DEFAULT_STYLES[underscored_widget_name] || [:none]
640
672
  end
641
673
 
642
- def ruby_attribute_setter(attribute_name)
643
- "#{attribute_name}="
644
- end
645
-
646
- def attribute_setter(attribute_name)
647
- "set#{attribute_name.to_s.camelcase(:upper)}"
648
- end
649
-
650
- def attribute_getter(attribute_name)
651
- "get#{attribute_name.to_s.camelcase(:upper)}"
652
- end
653
-
654
674
  # TODO refactor following methods to eliminate duplication
655
675
  # perhaps consider relying on raising an exception to avoid checking first
656
676
  # unless that gives obscure SWT errors
@@ -800,11 +820,14 @@ module Glimmer
800
820
  end
801
821
  # TODO consider detecting type on widget method and automatically invoking right converter (e.g. :to_s for String, :to_i for Integer)
802
822
  @property_type_converters ||= {
803
- alignment: -> (*value) {
823
+ accelerator: lambda { |*value|
804
824
  SWTProxy[*value]
805
825
  },
806
- :background => color_converter,
807
- :background_image => lambda do |*value|
826
+ alignment: lambda { |*value|
827
+ SWTProxy[*value]
828
+ },
829
+ background: color_converter,
830
+ background_image: lambda do |*value|
808
831
  image_proxy = ImageProxy.create(*value)
809
832
 
810
833
  if image_proxy&.file_path&.end_with?('.gif')
@@ -845,7 +868,7 @@ module Glimmer
845
868
 
846
869
  image_proxy&.swt_image
847
870
  end,
848
- :cursor => lambda do |value|
871
+ cursor: lambda do |value|
849
872
  cursor_proxy = nil
850
873
  if value.is_a?(CursorProxy)
851
874
  cursor_proxy = value
@@ -857,9 +880,9 @@ module Glimmer
857
880
  :enabled => lambda do |value|
858
881
  !!value
859
882
  end,
860
- :foreground => color_converter,
861
- :link_foreground => color_converter,
862
- :font => lambda do |value|
883
+ foreground: color_converter,
884
+ link_foreground: color_converter,
885
+ font: lambda do |value|
863
886
  if value.is_a?(Hash)
864
887
  font_properties = value
865
888
  FontProxy.new(self, font_properties).swt_font
@@ -867,21 +890,21 @@ module Glimmer
867
890
  value
868
891
  end
869
892
  end,
870
- :image => lambda do |*value|
893
+ image: lambda do |*value|
871
894
  ImageProxy.create(*value).swt_image
872
895
  end,
873
- :images => lambda do |array|
896
+ images: lambda do |array|
874
897
  array.to_a.map do |value|
875
898
  ImageProxy.create(value).swt_image
876
899
  end.to_java(Image)
877
900
  end,
878
- :items => lambda do |value|
901
+ items: lambda do |value|
879
902
  value.to_java :string
880
903
  end,
881
- :text => lambda do |value|
904
+ text: lambda do |value|
882
905
  value.to_s
883
906
  end,
884
- :transfer => lambda do |value|
907
+ transfer: lambda do |value|
885
908
  value = value.first if value.is_a?(Array) && value.size == 1 && value.first.is_a?(Array)
886
909
  transfer_object_extrapolator = lambda do |transfer_name|
887
910
  transfer_type = "#{transfer_name.to_s.camelcase(:upper)}Transfer".to_sym
@@ -900,9 +923,12 @@ module Glimmer
900
923
  result = result.to_java(Transfer) unless result.is_a?(ArrayJavaProxy)
901
924
  result
902
925
  end,
903
- :visible => lambda do |value|
926
+ visible: lambda do |value|
904
927
  !!value
905
928
  end,
929
+ weights: lambda do |value|
930
+ value.to_java(:int)
931
+ end,
906
932
  }
907
933
  end
908
934
  end
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2007-2020 Andy Maleh
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