glimmer-dsl-opal 0.1.0 → 0.2.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +195 -167
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal.rb +24 -7
  6. data/lib/glimmer-dsl-opal/ext/exception.rb +5 -0
  7. data/lib/glimmer-dsl-opal/missing/net/http.rb +17 -0
  8. data/lib/glimmer-dsl-opal/missing/uri.rb +26 -0
  9. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager.rb +0 -0
  10. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact.rb +0 -0
  11. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact_manager_presenter.rb +0 -0
  12. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact_repository.rb +24 -99
  13. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/login.rb +0 -0
  14. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe.rb +0 -0
  15. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe/board.rb +0 -0
  16. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe/cell.rb +0 -0
  17. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_browser.rb +0 -0
  18. data/lib/glimmer-dsl-opal/samples/hello/hello_combo.rb +63 -0
  19. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_computed.rb +0 -0
  20. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_computed/contact.rb +0 -0
  21. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_shell.rb +155 -0
  22. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_widget.rb +86 -0
  23. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_list_multi_selection.rb +0 -0
  24. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_list_single_selection.rb +0 -0
  25. data/lib/glimmer-dsl-opal/samples/hello/hello_tab.rb +50 -0
  26. data/lib/glimmer-dsl-opal/samples/hello/hello_world.rb +29 -0
  27. data/lib/{jquery.js → glimmer-dsl-opal/vendor/jquery.js} +0 -0
  28. data/lib/glimmer/data_binding/ext/observable_model.rb +1 -1
  29. data/lib/glimmer/dsl/opal/async_exec_expression.rb +2 -2
  30. data/lib/glimmer/dsl/opal/color_expression.rb +38 -0
  31. data/lib/glimmer/dsl/opal/custom_widget_expression.rb +57 -0
  32. data/lib/glimmer/dsl/opal/dsl.rb +7 -0
  33. data/lib/glimmer/dsl/opal/font_expression.rb +47 -0
  34. data/lib/glimmer/dsl/opal/property_expression.rb +5 -2
  35. data/lib/glimmer/dsl/opal/rgb_expression.rb +32 -0
  36. data/lib/glimmer/dsl/opal/rgba_expression.rb +32 -0
  37. data/lib/glimmer/dsl/opal/swt_expression.rb +46 -0
  38. data/lib/glimmer/dsl/opal/widget_expression.rb +2 -1
  39. data/lib/glimmer/dsl/opal/widget_listener_expression.rb +16 -3
  40. data/lib/glimmer/swt.rb +499 -0
  41. data/lib/glimmer/swt/browser_proxy.rb +1 -1
  42. data/lib/glimmer/swt/button_proxy.rb +2 -2
  43. data/lib/glimmer/swt/color_proxy.rb +119 -0
  44. data/lib/glimmer/swt/combo_proxy.rb +10 -9
  45. data/lib/glimmer/swt/composite_proxy.rb +8 -8
  46. data/lib/glimmer/{opal → swt}/display_proxy.rb +3 -1
  47. data/lib/glimmer/swt/fill_layout_proxy.rb +84 -0
  48. data/lib/glimmer/swt/font_proxy.rb +79 -0
  49. data/lib/glimmer/swt/grid_layout_proxy.rb +34 -4
  50. data/lib/glimmer/swt/label_proxy.rb +7 -3
  51. data/lib/glimmer/swt/layout_proxy.rb +15 -13
  52. data/lib/glimmer/swt/list_proxy.rb +17 -12
  53. data/lib/glimmer/swt/message_box_proxy.rb +4 -7
  54. data/lib/glimmer/swt/row_layout_proxy.rb +105 -0
  55. data/lib/glimmer/swt/shell_proxy.rb +32 -22
  56. data/lib/glimmer/swt/style_constantizable.rb +154 -0
  57. data/lib/glimmer/swt/swt_proxy.rb +53 -0
  58. data/lib/glimmer/swt/tab_folder_proxy.rb +8 -8
  59. data/lib/glimmer/swt/tab_item_proxy.rb +15 -32
  60. data/lib/glimmer/swt/table_proxy.rb +0 -18
  61. data/lib/glimmer/swt/widget_proxy.rb +140 -39
  62. data/lib/glimmer/ui/custom_shell.rb +73 -0
  63. data/lib/glimmer/ui/custom_widget.rb +290 -0
  64. data/lib/glimmer/util/proc_tracker.rb +39 -0
  65. metadata +88 -57
  66. data/lib/glimmer/opal/element_proxy.rb +0 -312
  67. data/lib/samples/elaborate/launch +0 -6
  68. data/lib/samples/hello/hello_combo.rb +0 -34
  69. data/lib/samples/hello/hello_tab.rb +0 -24
  70. data/lib/samples/hello/hello_world.rb +0 -8
  71. data/lib/samples/hello/launch +0 -10
  72. data/lib/samples/launch +0 -4
@@ -1,312 +0,0 @@
1
- require 'glimmer/swt/property_owner'
2
-
3
- module Glimmer
4
- module Opal
5
- class ElementProxy
6
- include Glimmer
7
- include Glimmer::SWT::PropertyOwner
8
- attr_reader :parent, :args, :css_classes, :css, :children, :enabled
9
-
10
- class << self
11
- def next_id_number_for(name)
12
- @max_id_numbers[name] = max_id_number_for(name) + 1
13
- end
14
-
15
- def max_id_number_for(name)
16
- @max_id_numbers[name] = max_id_numbers[name] || 0
17
- end
18
-
19
- def max_id_numbers
20
- @max_id_numbers ||= reset_max_id_numbers!
21
- end
22
-
23
- def reset_max_id_numbers!
24
- @max_id_numbers = {}
25
- end
26
- end
27
-
28
- def initialize(parent, args)
29
- @parent = parent
30
- @args = args
31
- @children = Set.new
32
- @css_classes = Set.new
33
- @css = ''
34
- @enabled = true
35
- @parent.add_child(self)
36
- end
37
-
38
- def dispose
39
- dom.remove
40
- end
41
-
42
- def add_child(child)
43
- # return if @children.include?(child) # TODO consider adding an option to enable this if needed to prevent dom repetition
44
- @children << child
45
- dom << child.dom
46
- end
47
-
48
- def enabled=(value)
49
- @enabled = value
50
- redraw
51
- end
52
-
53
- def redraw
54
- if @dom
55
- old_dom = @dom
56
- @dom = nil
57
- old_dom.replace dom
58
- else
59
- dom
60
- end
61
- @children.each do |child|
62
- child.redraw
63
- end
64
- end
65
-
66
- # Subclasses must override with their own mappings
67
- def observation_request_to_event_mapping
68
- {}
69
- end
70
-
71
- def name
72
- self.class.name.split('::').last.underscore.sub(/_proxy$/, '')
73
- end
74
-
75
- def id
76
- @id ||= "#{name}-#{ElementProxy.next_id_number_for(name)}"
77
- end
78
-
79
- # Sets id explicitly. Useful in cases of wanting to maintain a stable id
80
- def id=(value)
81
- @id = value
82
- end
83
-
84
- # Subclasses can override with their own selector
85
- def selector
86
- "#{name}##{id}"
87
- end
88
-
89
- def add_css_class(css_class)
90
- @css_classes << css_class
91
- redraw
92
- end
93
-
94
- def add_css_classes(css_classes)
95
- @css_classes += css_classes
96
- redraw
97
- end
98
-
99
- def remove_css_class(css_class)
100
- @css_classes.delete(css_class)
101
- redraw
102
- end
103
-
104
- def remove_css_classes(css_classes)
105
- @css_classes -= css_classes
106
- redraw
107
- end
108
-
109
- def clear_css_classes(css_class)
110
- @css_classes.clear
111
- redraw
112
- end
113
-
114
- def css=(css)
115
- @css = css
116
- redraw
117
- end
118
-
119
- def has_style?(symbol)
120
- @args.include?(symbol) # not a very solid implementation. Bring SWT constants eventually
121
- end
122
-
123
- def handle_observation_request(keyword, &event_listener)
124
- return unless observation_request_to_event_mapping.keys.include?(keyword)
125
- event = nil
126
- delegate = nil
127
- [observation_request_to_event_mapping[keyword]].flatten.each do |mapping|
128
- event = mapping[:event]
129
- event_handler = mapping[:event_handler]
130
- potential_event_listener = event_handler&.call(event_listener)
131
- event_listener = event_handler&.call(event_listener) || event_listener
132
- delegate = $document.on(event, selector, &event_listener)
133
- end
134
- EventListenerProxy.new(element_proxy: self, event: event, selector: selector, delegate: delegate)
135
- end
136
-
137
- def add_observer(observer, property_name)
138
- property_listener_installers = self.class.ancestors.map {|ancestor| widget_property_listener_installers[ancestor]}.compact
139
- widget_listener_installers = property_listener_installers.map{|installer| installer[property_name.to_s.to_sym]}.compact if !property_listener_installers.empty?
140
- widget_listener_installers.to_a.each do |widget_listener_installer|
141
- widget_listener_installer.call(observer)
142
- end
143
- end
144
-
145
- def set_attribute(attribute_name, *args)
146
- apply_property_type_converters(attribute_name, args)
147
- super(attribute_name, *args)
148
- end
149
-
150
- def apply_property_type_converters(attribute_name, args)
151
- if args.count == 1
152
- value = args.first
153
- converter = property_type_converters[attribute_name.to_sym]
154
- args[0] = converter.call(value) if converter
155
- end
156
- # if args.count == 1 && args.first.is_a?(ColorProxy)
157
- # g_color = args.first
158
- # args[0] = g_color.swt_color
159
- # end
160
- end
161
-
162
- def property_type_converters
163
- @property_type_converters ||= {
164
- # :background => color_converter,
165
- # :background_image => lambda do |value|
166
- # if value.is_a?(String)
167
- # if value.start_with?('uri:classloader')
168
- # value = value.sub(/^uri\:classloader\:\//, '')
169
- # object = java.lang.Object.new
170
- # value = object.java_class.resource_as_stream(value)
171
- # value = java.io.BufferedInputStream.new(value)
172
- # end
173
- # image_data = ImageData.new(value)
174
- # on_event_Resize do |resize_event|
175
- # new_image_data = image_data.scaledTo(@swt_widget.getSize.x, @swt_widget.getSize.y)
176
- # @swt_widget.getBackgroundImage&.dispose
177
- # @swt_widget.setBackgroundImage(Image.new(@swt_widget.getDisplay, new_image_data))
178
- # end
179
- # Image.new(@swt_widget.getDisplay, image_data)
180
- # else
181
- # value
182
- # end
183
- # end,
184
- # :foreground => color_converter,
185
- # :font => lambda do |value|
186
- # if value.is_a?(Hash)
187
- # font_properties = value
188
- # FontProxy.new(self, font_properties).swt_font
189
- # else
190
- # value
191
- # end
192
- # end,
193
- # :items => lambda do |value|
194
- # value.to_java :string
195
- # end,
196
- :text => lambda do |value|
197
- # if swt_widget.is_a?(Browser)
198
- # value.to_s
199
- # else
200
- value.to_s
201
- # end
202
- end,
203
- # :visible => lambda do |value|
204
- # !!value
205
- # end,
206
- }
207
- end
208
-
209
- def widget_property_listener_installers
210
- @swt_widget_property_listener_installers ||= {
211
- # ElementProxy => {
212
- # :focus => lambda do |observer|
213
- # on_focus_gained { |focus_event|
214
- # observer.call(true)
215
- # }
216
- # on_focus_lost { |focus_event|
217
- # observer.call(false)
218
- # }
219
- # end,
220
- # },
221
- InputProxy => {
222
- :text => lambda do |observer|
223
- on_modify_text { |modify_event|
224
- observer.call(text)
225
- }
226
- end,
227
- # :caret_position => lambda do |observer|
228
- # on_event_keydown { |event|
229
- # observer.call(getCaretPosition)
230
- # }
231
- # on_event_keyup { |event|
232
- # observer.call(getCaretPosition)
233
- # }
234
- # on_event_mousedown { |event|
235
- # observer.call(getCaretPosition)
236
- # }
237
- # on_event_mouseup { |event|
238
- # observer.call(getCaretPosition)
239
- # }
240
- # end,
241
- # :selection => lambda do |observer|
242
- # on_event_keydown { |event|
243
- # observer.call(getSelection)
244
- # }
245
- # on_event_keyup { |event|
246
- # observer.call(getSelection)
247
- # }
248
- # on_event_mousedown { |event|
249
- # observer.call(getSelection)
250
- # }
251
- # on_event_mouseup { |event|
252
- # observer.call(getSelection)
253
- # }
254
- # end,
255
- # :selection_count => lambda do |observer|
256
- # on_event_keydown { |event|
257
- # observer.call(getSelectionCount)
258
- # }
259
- # on_event_keyup { |event|
260
- # observer.call(getSelectionCount)
261
- # }
262
- # on_event_mousedown { |event|
263
- # observer.call(getSelectionCount)
264
- # }
265
- # on_event_mouseup { |event|
266
- # observer.call(getSelectionCount)
267
- # }
268
- # end,
269
- # :top_index => lambda do |observer|
270
- # @last_top_index = getTopIndex
271
- # on_paint_control { |event|
272
- # if getTopIndex != @last_top_index
273
- # @last_top_index = getTopIndex
274
- # observer.call(@last_top_index)
275
- # end
276
- # }
277
- # end,
278
- },
279
- # Java::OrgEclipseSwtCustom::StyledText => {
280
- # :text => lambda do |observer|
281
- # on_modify_text { |modify_event|
282
- # observer.call(getText)
283
- # }
284
- # end,
285
- # },
286
- # InputProxy => {
287
- # :selection => lambda do |observer|
288
- # on_widget_selected { |selection_event|
289
- # observer.call(getSelection)
290
- # }
291
- # end
292
- # },
293
- # Java::OrgEclipseSwtWidgets::MenuItem => {
294
- # :selection => lambda do |observer|
295
- # on_widget_selected { |selection_event|
296
- # observer.call(getSelection)
297
- # }
298
- # end
299
- # },
300
- # Java::OrgEclipseSwtWidgets::Spinner => {
301
- # :selection => lambda do |observer|
302
- # on_widget_selected { |selection_event|
303
- # observer.call(getSelection)
304
- # }
305
- # end
306
- # },
307
- }
308
- end
309
-
310
- end
311
- end
312
- end
@@ -1,6 +0,0 @@
1
- # Launches all samples
2
- export DIR=`echo $0 | sed "s/launch//"`
3
- ${DIR}../../bin/glimmer \
4
- "${DIR}contact_manager.rb" \
5
- "${DIR}login.rb" \
6
- "${DIR}tic_tac_toe.rb"
@@ -1,34 +0,0 @@
1
- class Person
2
- attr_accessor :country, :country_options
3
-
4
- def initialize
5
- self.country_options=["", "Canada", "US", "Mexico"]
6
- self.country = "Canada"
7
- end
8
-
9
- def reset_country
10
- self.country = "Canada"
11
- end
12
- end
13
-
14
- class HelloCombo
15
- include Glimmer
16
- def launch
17
- person = Person.new
18
- shell {
19
- composite {
20
- combo(:read_only) {
21
- selection bind(person, :country)
22
- }
23
- button {
24
- text "Reset"
25
- on_widget_selected do
26
- person.reset_country
27
- end
28
- }
29
- }
30
- }.open
31
- end
32
- end
33
-
34
- HelloCombo.new.launch
@@ -1,24 +0,0 @@
1
- class HelloTab
2
- include Glimmer
3
- def launch
4
- shell {
5
- text "Hello, Tab!"
6
- tab_folder {
7
- tab_item {
8
- text "English"
9
- label {
10
- text "Hello, World!"
11
- }
12
- }
13
- tab_item {
14
- text "French"
15
- label {
16
- text "Bonjour, Univers!"
17
- }
18
- }
19
- }
20
- }.open
21
- end
22
- end
23
-
24
- HelloTab.new.launch
@@ -1,8 +0,0 @@
1
- include Glimmer
2
-
3
- shell {
4
- text "Glimmer"
5
- label {
6
- text "Hello, World!"
7
- }
8
- }.open
@@ -1,10 +0,0 @@
1
- # Launches all samples
2
- export DIR=`echo $0 | sed "s/launch//"`
3
- ${DIR}../../bin/glimmer \
4
- "${DIR}hello_browser.rb" \
5
- "${DIR}hello_combo.rb" \
6
- "${DIR}hello_computed.rb" \
7
- "${DIR}hello_list_multi_selection.rb" \
8
- "${DIR}hello_list_single_selection.rb" \
9
- "${DIR}hello_tab.rb" \
10
- "${DIR}hello_world.rb"
@@ -1,4 +0,0 @@
1
- # Launches all samples
2
- export DIR=`echo $0 | sed "s/launch//"`
3
- ${DIR}hello/launch &
4
- ${DIR}elaborate/launch