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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +195 -167
- data/VERSION +1 -1
- data/lib/glimmer-dsl-opal.rb +24 -7
- data/lib/glimmer-dsl-opal/ext/exception.rb +5 -0
- data/lib/glimmer-dsl-opal/missing/net/http.rb +17 -0
- data/lib/glimmer-dsl-opal/missing/uri.rb +26 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact_manager_presenter.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact_repository.rb +24 -99
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/login.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe/board.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe/cell.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_browser.rb +0 -0
- data/lib/glimmer-dsl-opal/samples/hello/hello_combo.rb +63 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_computed.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_computed/contact.rb +0 -0
- data/lib/glimmer-dsl-opal/samples/hello/hello_custom_shell.rb +155 -0
- data/lib/glimmer-dsl-opal/samples/hello/hello_custom_widget.rb +86 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_list_multi_selection.rb +0 -0
- data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_list_single_selection.rb +0 -0
- data/lib/glimmer-dsl-opal/samples/hello/hello_tab.rb +50 -0
- data/lib/glimmer-dsl-opal/samples/hello/hello_world.rb +29 -0
- data/lib/{jquery.js → glimmer-dsl-opal/vendor/jquery.js} +0 -0
- data/lib/glimmer/data_binding/ext/observable_model.rb +1 -1
- data/lib/glimmer/dsl/opal/async_exec_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/color_expression.rb +38 -0
- data/lib/glimmer/dsl/opal/custom_widget_expression.rb +57 -0
- data/lib/glimmer/dsl/opal/dsl.rb +7 -0
- data/lib/glimmer/dsl/opal/font_expression.rb +47 -0
- data/lib/glimmer/dsl/opal/property_expression.rb +5 -2
- data/lib/glimmer/dsl/opal/rgb_expression.rb +32 -0
- data/lib/glimmer/dsl/opal/rgba_expression.rb +32 -0
- data/lib/glimmer/dsl/opal/swt_expression.rb +46 -0
- data/lib/glimmer/dsl/opal/widget_expression.rb +2 -1
- data/lib/glimmer/dsl/opal/widget_listener_expression.rb +16 -3
- data/lib/glimmer/swt.rb +499 -0
- data/lib/glimmer/swt/browser_proxy.rb +1 -1
- data/lib/glimmer/swt/button_proxy.rb +2 -2
- data/lib/glimmer/swt/color_proxy.rb +119 -0
- data/lib/glimmer/swt/combo_proxy.rb +10 -9
- data/lib/glimmer/swt/composite_proxy.rb +8 -8
- data/lib/glimmer/{opal → swt}/display_proxy.rb +3 -1
- data/lib/glimmer/swt/fill_layout_proxy.rb +84 -0
- data/lib/glimmer/swt/font_proxy.rb +79 -0
- data/lib/glimmer/swt/grid_layout_proxy.rb +34 -4
- data/lib/glimmer/swt/label_proxy.rb +7 -3
- data/lib/glimmer/swt/layout_proxy.rb +15 -13
- data/lib/glimmer/swt/list_proxy.rb +17 -12
- data/lib/glimmer/swt/message_box_proxy.rb +4 -7
- data/lib/glimmer/swt/row_layout_proxy.rb +105 -0
- data/lib/glimmer/swt/shell_proxy.rb +32 -22
- data/lib/glimmer/swt/style_constantizable.rb +154 -0
- data/lib/glimmer/swt/swt_proxy.rb +53 -0
- data/lib/glimmer/swt/tab_folder_proxy.rb +8 -8
- data/lib/glimmer/swt/tab_item_proxy.rb +15 -32
- data/lib/glimmer/swt/table_proxy.rb +0 -18
- data/lib/glimmer/swt/widget_proxy.rb +140 -39
- data/lib/glimmer/ui/custom_shell.rb +73 -0
- data/lib/glimmer/ui/custom_widget.rb +290 -0
- data/lib/glimmer/util/proc_tracker.rb +39 -0
- metadata +88 -57
- data/lib/glimmer/opal/element_proxy.rb +0 -312
- data/lib/samples/elaborate/launch +0 -6
- data/lib/samples/hello/hello_combo.rb +0 -34
- data/lib/samples/hello/hello_tab.rb +0 -24
- data/lib/samples/hello/hello_world.rb +0 -8
- data/lib/samples/hello/launch +0 -10
- 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,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
|
data/lib/samples/hello/launch
DELETED
@@ -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"
|
data/lib/samples/launch
DELETED