glimmer-dsl-swt 4.18.4.0 → 4.18.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/LICENSE.txt +20 -20
  4. data/README.md +84 -5078
  5. data/RUBY_VERSION +1 -1
  6. data/VERSION +1 -1
  7. data/bin/girb +31 -31
  8. data/bin/girb_runner.rb +34 -34
  9. data/bin/glimmer +26 -26
  10. data/docs/reference/GLIMMER_COMMAND.md +591 -0
  11. data/docs/reference/GLIMMER_CONFIGURATION.md +183 -0
  12. data/docs/reference/GLIMMER_GIRB.md +30 -0
  13. data/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md +3251 -0
  14. data/docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md +202 -0
  15. data/docs/reference/GLIMMER_SAMPLES.md +676 -0
  16. data/docs/reference/GLIMMER_STYLE_GUIDE.md +14 -0
  17. data/glimmer-dsl-swt.gemspec +16 -8
  18. data/lib/ext/glimmer.rb +41 -41
  19. data/lib/ext/glimmer/config.rb +167 -167
  20. data/lib/ext/rouge/themes/glimmer.rb +29 -29
  21. data/lib/glimmer-dsl-swt.rb +44 -44
  22. data/lib/glimmer/Rakefile +26 -26
  23. data/lib/glimmer/data_binding/list_selection_binding.rb +72 -72
  24. data/lib/glimmer/data_binding/observable_widget.rb +38 -38
  25. data/lib/glimmer/data_binding/shine.rb +44 -44
  26. data/lib/glimmer/data_binding/table_items_binding.rb +89 -89
  27. data/lib/glimmer/data_binding/tree_items_binding.rb +108 -108
  28. data/lib/glimmer/data_binding/widget_binding.rb +73 -73
  29. data/lib/glimmer/dsl/swt/animation_expression.rb +43 -43
  30. data/lib/glimmer/dsl/swt/async_exec_expression.rb +35 -35
  31. data/lib/glimmer/dsl/swt/bind_expression.rb +58 -58
  32. data/lib/glimmer/dsl/swt/block_property_expression.rb +41 -41
  33. data/lib/glimmer/dsl/swt/checkbox_group_selection_data_binding_expression.rb +61 -61
  34. data/lib/glimmer/dsl/swt/color_expression.rb +40 -40
  35. data/lib/glimmer/dsl/swt/column_properties_expression.rb +45 -45
  36. data/lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb +67 -67
  37. data/lib/glimmer/dsl/swt/cursor_expression.rb +44 -44
  38. data/lib/glimmer/dsl/swt/custom_widget_expression.rb +3 -3
  39. data/lib/glimmer/dsl/swt/data_binding_expression.rb +55 -55
  40. data/lib/glimmer/dsl/swt/dialog_expression.rb +48 -48
  41. data/lib/glimmer/dsl/swt/directory_dialog_expression.rb +48 -48
  42. data/lib/glimmer/dsl/swt/display_expression.rb +40 -40
  43. data/lib/glimmer/dsl/swt/dnd_expression.rb +46 -46
  44. data/lib/glimmer/dsl/swt/dsl.rb +63 -63
  45. data/lib/glimmer/dsl/swt/exec_expression.rb +1 -1
  46. data/lib/glimmer/dsl/swt/expand_item_expression.rb +60 -60
  47. data/lib/glimmer/dsl/swt/file_dialog_expression.rb +48 -48
  48. data/lib/glimmer/dsl/swt/font_expression.rb +49 -49
  49. data/lib/glimmer/dsl/swt/image_expression.rb +50 -50
  50. data/lib/glimmer/dsl/swt/layout_data_expression.rb +46 -46
  51. data/lib/glimmer/dsl/swt/layout_expression.rb +50 -50
  52. data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +65 -65
  53. data/lib/glimmer/dsl/swt/menu_bar_expression.rb +54 -54
  54. data/lib/glimmer/dsl/swt/menu_expression.rb +53 -53
  55. data/lib/glimmer/dsl/swt/message_box_expression.rb +54 -54
  56. data/lib/glimmer/dsl/swt/multiply_expression.rb +53 -53
  57. data/lib/glimmer/dsl/swt/observe_expression.rb +8 -5
  58. data/lib/glimmer/dsl/swt/property_expression.rb +46 -46
  59. data/lib/glimmer/dsl/swt/radio_group_selection_data_binding_expression.rb +61 -61
  60. data/lib/glimmer/dsl/swt/rgb_expression.rb +33 -33
  61. data/lib/glimmer/dsl/swt/rgba_expression.rb +33 -33
  62. data/lib/glimmer/dsl/swt/shape_expression.rb +54 -54
  63. data/lib/glimmer/dsl/swt/shell_expression.rb +46 -46
  64. data/lib/glimmer/dsl/swt/swt_expression.rb +46 -46
  65. data/lib/glimmer/dsl/swt/sync_exec_expression.rb +36 -36
  66. data/lib/glimmer/dsl/swt/tab_item_expression.rb +54 -54
  67. data/lib/glimmer/dsl/swt/table_items_data_binding_expression.rb +52 -52
  68. data/lib/glimmer/dsl/swt/timer_exec_expression.rb +35 -0
  69. data/lib/glimmer/dsl/swt/transform_expression.rb +55 -55
  70. data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +52 -52
  71. data/lib/glimmer/dsl/swt/tree_properties_expression.rb +47 -47
  72. data/lib/glimmer/dsl/swt/widget_expression.rb +66 -66
  73. data/lib/glimmer/dsl/swt/widget_listener_expression.rb +53 -53
  74. data/lib/glimmer/rake_task.rb +220 -220
  75. data/lib/glimmer/rake_task/list.rb +97 -97
  76. data/lib/glimmer/rake_task/package.rb +139 -139
  77. data/lib/glimmer/rake_task/scaffold.rb +765 -765
  78. data/lib/glimmer/swt/color_proxy.rb +107 -107
  79. data/lib/glimmer/swt/cursor_proxy.rb +66 -66
  80. data/lib/glimmer/swt/custom/animation.rb +12 -8
  81. data/lib/glimmer/swt/custom/checkbox_group.rb +181 -181
  82. data/lib/glimmer/swt/custom/code_text.rb +62 -28
  83. data/lib/glimmer/swt/custom/drawable.rb +49 -49
  84. data/lib/glimmer/swt/custom/radio_group.rb +176 -176
  85. data/lib/glimmer/swt/custom/shape.rb +5 -3
  86. data/lib/glimmer/swt/date_time_proxy.rb +85 -85
  87. data/lib/glimmer/swt/directory_dialog_proxy.rb +65 -65
  88. data/lib/glimmer/swt/display_proxy.rb +11 -10
  89. data/lib/glimmer/swt/dnd_proxy.rb +51 -51
  90. data/lib/glimmer/swt/expand_item_proxy.rb +97 -97
  91. data/lib/glimmer/swt/file_dialog_proxy.rb +66 -66
  92. data/lib/glimmer/swt/font_proxy.rb +94 -94
  93. data/lib/glimmer/swt/image_proxy.rb +184 -184
  94. data/lib/glimmer/swt/layout_data_proxy.rb +105 -105
  95. data/lib/glimmer/swt/layout_proxy.rb +112 -109
  96. data/lib/glimmer/swt/menu_proxy.rb +126 -126
  97. data/lib/glimmer/swt/message_box_proxy.rb +89 -89
  98. data/lib/glimmer/swt/packages.rb +37 -37
  99. data/lib/glimmer/swt/properties.rb +49 -49
  100. data/lib/glimmer/swt/sash_form_proxy.rb +53 -53
  101. data/lib/glimmer/swt/scrolled_composite_proxy.rb +37 -37
  102. data/lib/glimmer/swt/shell_proxy.rb +1 -1
  103. data/lib/glimmer/swt/style_constantizable.rb +157 -157
  104. data/lib/glimmer/swt/styled_text_proxy.rb +38 -38
  105. data/lib/glimmer/swt/swt_proxy.rb +59 -59
  106. data/lib/glimmer/swt/tab_item_proxy.rb +91 -91
  107. data/lib/glimmer/swt/table_column_proxy.rb +57 -57
  108. data/lib/glimmer/swt/table_proxy.rb +2 -2
  109. data/lib/glimmer/swt/transform_proxy.rb +109 -109
  110. data/lib/glimmer/swt/tree_proxy.rb +145 -145
  111. data/lib/glimmer/swt/widget_listener_proxy.rb +64 -64
  112. data/lib/glimmer/swt/widget_proxy.rb +14 -4
  113. data/lib/glimmer/ui/custom_shell.rb +82 -82
  114. data/lib/glimmer/ui/custom_widget.rb +17 -0
  115. data/lib/glimmer/util/proc_tracker.rb +39 -39
  116. data/samples/elaborate/contact_manager.rb +142 -142
  117. data/samples/elaborate/contact_manager/contact.rb +32 -32
  118. data/samples/elaborate/contact_manager/contact_manager_presenter.rb +47 -47
  119. data/samples/elaborate/contact_manager/contact_repository.rb +169 -169
  120. data/samples/elaborate/login.rb +123 -123
  121. data/samples/elaborate/meta_sample.rb +15 -4
  122. data/samples/elaborate/tetris.rb +14 -17
  123. data/samples/elaborate/tetris/model/block.rb +48 -48
  124. data/samples/elaborate/tetris/model/game.rb +1 -2
  125. data/samples/elaborate/tetris/model/past_game.rb +39 -39
  126. data/samples/elaborate/tetris/view/high_score_dialog.rb +0 -7
  127. data/samples/elaborate/tetris/view/playfield.rb +1 -1
  128. data/samples/elaborate/tetris/view/tetris_menu_bar.rb +13 -11
  129. data/samples/elaborate/tic_tac_toe.rb +76 -76
  130. data/samples/elaborate/tic_tac_toe/board.rb +145 -145
  131. data/samples/elaborate/tic_tac_toe/cell.rb +48 -48
  132. data/samples/elaborate/user_profile.rb +76 -76
  133. data/samples/hello/hello_browser.rb +31 -31
  134. data/samples/hello/hello_button.rb +46 -46
  135. data/samples/hello/hello_canvas.rb +64 -64
  136. data/samples/hello/hello_canvas_transform.rb +1 -1
  137. data/samples/hello/hello_checkbox.rb +85 -85
  138. data/samples/hello/hello_checkbox_group.rb +71 -71
  139. data/samples/hello/hello_code_text.rb +104 -92
  140. data/samples/hello/hello_combo.rb +63 -63
  141. data/samples/hello/hello_computed.rb +96 -96
  142. data/samples/hello/hello_computed/contact.rb +42 -42
  143. data/samples/hello/hello_custom_shell.rb +155 -155
  144. data/samples/hello/hello_custom_widget.rb +86 -86
  145. data/samples/hello/hello_date_time.rb +63 -63
  146. data/samples/hello/hello_dialog.rb +78 -78
  147. data/samples/hello/hello_directory_dialog.rb +60 -60
  148. data/samples/hello/hello_drag_and_drop.rb +50 -50
  149. data/samples/hello/hello_expand_bar.rb +110 -110
  150. data/samples/hello/hello_file_dialog.rb +60 -60
  151. data/samples/hello/hello_group.rb +104 -104
  152. data/samples/hello/hello_link.rb +80 -80
  153. data/samples/hello/hello_list_multi_selection.rb +74 -74
  154. data/samples/hello/hello_list_single_selection.rb +59 -59
  155. data/samples/hello/hello_menu_bar.rb +241 -241
  156. data/samples/hello/hello_message_box.rb +37 -37
  157. data/samples/hello/hello_pop_up_context_menu.rb +84 -84
  158. data/samples/hello/hello_radio.rb +108 -108
  159. data/samples/hello/hello_radio_group.rb +87 -87
  160. data/samples/hello/hello_sash_form.rb +137 -137
  161. data/samples/hello/hello_spinner.rb +69 -69
  162. data/samples/hello/hello_styled_text.rb +138 -138
  163. data/samples/hello/hello_tab.rb +50 -50
  164. data/samples/hello/hello_table.rb +1 -0
  165. data/samples/hello/hello_world.rb +29 -29
  166. metadata +13 -5
  167. data/samples/elaborate/meta_sample/meta_sample_logo.png +0 -0
@@ -1,145 +1,145 @@
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
- require 'glimmer/swt/widget_proxy'
23
-
24
- module Glimmer
25
- module SWT
26
- class TreeProxy < Glimmer::SWT::WidgetProxy
27
- include Glimmer
28
-
29
- attr_reader :tree_editor, :tree_editor_text_proxy
30
- attr_accessor :tree_properties
31
-
32
- def initialize(underscored_widget_name, parent, args)
33
- super
34
- @tree_editor = TreeEditor.new(swt_widget)
35
- @tree_editor.horizontalAlignment = SWTProxy[:left]
36
- @tree_editor.grabHorizontal = true
37
- @tree_editor.minimumHeight = 20
38
- end
39
-
40
- # Performs depth first search for tree items matching block condition
41
- # If no condition block is passed, returns all tree items
42
- # Returns a Java TreeItem array to easily set as selection on org.eclipse.swt.Tree if needed
43
- def depth_first_search(&condition)
44
- found = []
45
- recursive_depth_first_search(swt_widget.getItems.first, found, &condition)
46
- found.to_java(TreeItem)
47
- end
48
-
49
- # Returns all tree items including descendants
50
- def all_tree_items
51
- depth_first_search
52
- end
53
-
54
- def widget_property_listener_installers
55
- super.merge({
56
- Java::OrgEclipseSwtWidgets::Tree => {
57
- selection: lambda do |observer|
58
- on_widget_selected { |selection_event|
59
- observer.call(@swt_widget.getSelection)
60
- }
61
- end
62
- },
63
- })
64
- end
65
-
66
- def edit_in_progress?
67
- !!@edit_in_progress
68
- end
69
-
70
- def edit_selected_tree_item(before_write: nil, after_write: nil, after_cancel: nil)
71
- edit_tree_item(swt_widget.getSelection.first, before_write: before_write, after_write: after_write, after_cancel: after_cancel)
72
- end
73
-
74
- def edit_tree_item(tree_item, before_write: nil, after_write: nil, after_cancel: nil)
75
- return if tree_item.nil?
76
- content {
77
- @tree_editor_text_proxy = text {
78
- focus true
79
- text tree_item.getText
80
- action_taken = false
81
- cancel = lambda {
82
- @tree_editor_text_proxy.swt_widget.dispose
83
- @tree_editor_text_proxy = nil
84
- after_cancel&.call
85
- @edit_in_progress = false
86
- }
87
- action = lambda { |event|
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
107
- end
108
- rescue => e
109
- Glimmer::Config.logger.error {"Error encountered while editing tree item!\n#{e.full_message}"}
110
- end
111
- }
112
- on_focus_lost(&action)
113
- on_key_pressed { |key_event|
114
- if key_event.keyCode == swt(:cr)
115
- action.call(key_event)
116
- elsif key_event.keyCode == swt(:esc)
117
- cancel.call
118
- end
119
- }
120
- }
121
- @tree_editor_text_proxy.swt_widget.selectAll
122
- }
123
- @tree_editor.setEditor(@tree_editor_text_proxy.swt_widget, tree_item)
124
- end
125
-
126
- private
127
-
128
- def recursive_depth_first_search(tree_item, found, &condition)
129
- return if tree_item.nil?
130
- found << tree_item if condition.nil? || condition.call(tree_item)
131
- tree_item.getItems.each do |child_tree_item|
132
- recursive_depth_first_search(child_tree_item, found, &condition)
133
- end
134
- end
135
-
136
- def property_type_converters
137
- super.merge({
138
- selection: lambda do |value|
139
- depth_first_search {|ti| ti.getData == value}
140
- end,
141
- })
142
- end
143
- end
144
- end
145
- end
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
+ require 'glimmer/swt/widget_proxy'
23
+
24
+ module Glimmer
25
+ module SWT
26
+ class TreeProxy < Glimmer::SWT::WidgetProxy
27
+ include Glimmer
28
+
29
+ attr_reader :tree_editor, :tree_editor_text_proxy
30
+ attr_accessor :tree_properties
31
+
32
+ def initialize(underscored_widget_name, parent, args)
33
+ super
34
+ @tree_editor = TreeEditor.new(swt_widget)
35
+ @tree_editor.horizontalAlignment = SWTProxy[:left]
36
+ @tree_editor.grabHorizontal = true
37
+ @tree_editor.minimumHeight = 20
38
+ end
39
+
40
+ # Performs depth first search for tree items matching block condition
41
+ # If no condition block is passed, returns all tree items
42
+ # Returns a Java TreeItem array to easily set as selection on org.eclipse.swt.Tree if needed
43
+ def depth_first_search(&condition)
44
+ found = []
45
+ recursive_depth_first_search(swt_widget.getItems.first, found, &condition)
46
+ found.to_java(TreeItem)
47
+ end
48
+
49
+ # Returns all tree items including descendants
50
+ def all_tree_items
51
+ depth_first_search
52
+ end
53
+
54
+ def widget_property_listener_installers
55
+ super.merge({
56
+ Java::OrgEclipseSwtWidgets::Tree => {
57
+ selection: lambda do |observer|
58
+ on_widget_selected { |selection_event|
59
+ observer.call(@swt_widget.getSelection)
60
+ }
61
+ end
62
+ },
63
+ })
64
+ end
65
+
66
+ def edit_in_progress?
67
+ !!@edit_in_progress
68
+ end
69
+
70
+ def edit_selected_tree_item(before_write: nil, after_write: nil, after_cancel: nil)
71
+ edit_tree_item(swt_widget.getSelection.first, before_write: before_write, after_write: after_write, after_cancel: after_cancel)
72
+ end
73
+
74
+ def edit_tree_item(tree_item, before_write: nil, after_write: nil, after_cancel: nil)
75
+ return if tree_item.nil?
76
+ content {
77
+ @tree_editor_text_proxy = text {
78
+ focus true
79
+ text tree_item.getText
80
+ action_taken = false
81
+ cancel = lambda {
82
+ @tree_editor_text_proxy.swt_widget.dispose
83
+ @tree_editor_text_proxy = nil
84
+ after_cancel&.call
85
+ @edit_in_progress = false
86
+ }
87
+ action = lambda { |event|
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
107
+ end
108
+ rescue => e
109
+ Glimmer::Config.logger.error {"Error encountered while editing tree item!\n#{e.full_message}"}
110
+ end
111
+ }
112
+ on_focus_lost(&action)
113
+ on_key_pressed { |key_event|
114
+ if key_event.keyCode == swt(:cr)
115
+ action.call(key_event)
116
+ elsif key_event.keyCode == swt(:esc)
117
+ cancel.call
118
+ end
119
+ }
120
+ }
121
+ @tree_editor_text_proxy.swt_widget.selectAll
122
+ }
123
+ @tree_editor.setEditor(@tree_editor_text_proxy.swt_widget, tree_item)
124
+ end
125
+
126
+ private
127
+
128
+ def recursive_depth_first_search(tree_item, found, &condition)
129
+ return if tree_item.nil?
130
+ found << tree_item if condition.nil? || condition.call(tree_item)
131
+ tree_item.getItems.each do |child_tree_item|
132
+ recursive_depth_first_search(child_tree_item, found, &condition)
133
+ end
134
+ end
135
+
136
+ def property_type_converters
137
+ super.merge({
138
+ selection: lambda do |value|
139
+ depth_first_search {|ti| ti.getData == value}
140
+ end,
141
+ })
142
+ end
143
+ end
144
+ end
145
+ end
@@ -1,64 +1,64 @@
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
- # Proxy for widget listeners
25
- #
26
- # Follows the Proxy Design Pattern
27
- class WidgetListenerProxy
28
-
29
- attr_reader :swt_widget, :swt_display, :swt_listener, :widget_add_listener_method, :swt_listener_class, :swt_listener_method, :event_type, :swt_constant
30
-
31
- def initialize(swt_widget:nil, swt_display:nil, swt_listener:, widget_add_listener_method: nil, swt_listener_class: nil, swt_listener_method: nil, event_type: nil, swt_constant: nil, filter: false)
32
- @swt_widget = swt_widget
33
- @swt_display = swt_display
34
- @filter = filter
35
- @swt_listener = swt_listener
36
- @widget_add_listener_method = widget_add_listener_method
37
- @swt_listener_class = swt_listener_class
38
- @swt_listener_method = swt_listener_method
39
- @event_type = event_type
40
- @swt_constant = swt_constant
41
- end
42
-
43
- def widget_remove_listener_method
44
- @widget_add_listener_method.sub('add', 'remove')
45
- end
46
-
47
- def deregister
48
- return if @swt_widget&.is_disposed || @swt_display&.is_disposed
49
- if @swt_display
50
- if @filter
51
- @swt_display.removeFilter(@event_type, @swt_listener)
52
- else
53
- @swt_display.removeListener(@event_type, @swt_listener)
54
- end
55
- elsif @event_type
56
- @swt_widget.removeListener(@event_type, @swt_listener)
57
- else
58
- @swt_widget.send(widget_remove_listener_method, @swt_listener)
59
- end
60
- end
61
- alias unregister deregister # TODO consider dropping unregister (and in Observer too)
62
- end
63
- end
64
- end
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
+ # Proxy for widget listeners
25
+ #
26
+ # Follows the Proxy Design Pattern
27
+ class WidgetListenerProxy
28
+
29
+ attr_reader :swt_widget, :swt_display, :swt_listener, :widget_add_listener_method, :swt_listener_class, :swt_listener_method, :event_type, :swt_constant
30
+
31
+ def initialize(swt_widget:nil, swt_display:nil, swt_listener:, widget_add_listener_method: nil, swt_listener_class: nil, swt_listener_method: nil, event_type: nil, swt_constant: nil, filter: false)
32
+ @swt_widget = swt_widget
33
+ @swt_display = swt_display
34
+ @filter = filter
35
+ @swt_listener = swt_listener
36
+ @widget_add_listener_method = widget_add_listener_method
37
+ @swt_listener_class = swt_listener_class
38
+ @swt_listener_method = swt_listener_method
39
+ @event_type = event_type
40
+ @swt_constant = swt_constant
41
+ end
42
+
43
+ def widget_remove_listener_method
44
+ @widget_add_listener_method.sub('add', 'remove')
45
+ end
46
+
47
+ def deregister
48
+ return if @swt_widget&.is_disposed || @swt_display&.is_disposed
49
+ if @swt_display
50
+ if @filter
51
+ @swt_display.removeFilter(@event_type, @swt_listener)
52
+ else
53
+ @swt_display.removeListener(@event_type, @swt_listener)
54
+ end
55
+ elsif @event_type
56
+ @swt_widget.removeListener(@event_type, @swt_listener)
57
+ else
58
+ @swt_widget.send(widget_remove_listener_method, @swt_listener)
59
+ end
60
+ end
61
+ alias unregister deregister # TODO consider dropping unregister (and in Observer too)
62
+ end
63
+ end
64
+ end
@@ -50,6 +50,7 @@ module Glimmer
50
50
  DEFAULT_STYLES = {
51
51
  'arrow' => [:arrow],
52
52
  'button' => [:push],
53
+ 'canvas' => [:double_buffered],
53
54
  'checkbox' => [:check],
54
55
  'check' => [:check],
55
56
  'drag_source' => [:drop_copy],
@@ -165,6 +166,7 @@ module Glimmer
165
166
  DEFAULT_INITIALIZERS[underscored_widget_name.to_s.to_sym]&.call(@swt_widget)
166
167
  @parent_proxy.post_initialize_child(self)
167
168
  end
169
+ @keyword = underscored_widget_name.to_s
168
170
  if respond_to?(:on_widget_disposed)
169
171
  on_widget_disposed {
170
172
  clear_shapes
@@ -177,7 +179,9 @@ module Glimmer
177
179
  # No Op by default
178
180
  end
179
181
 
180
- # Subclasses may override to perform post add_content work
182
+ # Subclasses may override to perform post add_content work.
183
+ # Make sure its logic detects if it ran before since it could run multiple times
184
+ # when adding content multiple times post creation.
181
185
  def post_add_content
182
186
  # No Op by default
183
187
  end
@@ -543,6 +547,10 @@ module Glimmer
543
547
  DisplayProxy.instance.sync_exec(&block)
544
548
  end
545
549
 
550
+ def timer_exec(delay_in_millis, &block)
551
+ DisplayProxy.instance.timer_exec(delay_in_millis, &block)
552
+ end
553
+
546
554
  def has_style?(style)
547
555
  comparison = interpret_style(style)
548
556
  (@swt_widget.style & comparison) == comparison
@@ -564,9 +572,11 @@ module Glimmer
564
572
 
565
573
  # Used for data-binding only. Consider renaming or improving to avoid the confusion it causes
566
574
  def add_observer(observer, property_name)
567
- property_listener_installers = @swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
568
- widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
569
- widget_listener_installers.to_a.first&.call(observer)
575
+ if !observer.respond_to?(:binding_options) || !observer.binding_options[:read_only]
576
+ property_listener_installers = @swt_widget.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
577
+ widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
578
+ widget_listener_installers.to_a.first&.call(observer)
579
+ end
570
580
  end
571
581
 
572
582
  def remove_observer(observer, property_name)