glimmer-dsl-opal 0.4.0 → 0.5.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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/README.md +530 -13
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal/samples/hello/hello_checkbox.rb +85 -0
  6. data/lib/glimmer-dsl-opal/samples/hello/hello_checkbox_group.rb +68 -0
  7. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_widget.rb +3 -3
  8. data/lib/glimmer-dsl-opal/samples/hello/hello_group.rb +104 -0
  9. data/lib/glimmer-dsl-opal/samples/hello/hello_radio.rb +108 -0
  10. data/lib/glimmer-dsl-opal/samples/hello/hello_radio_group.rb +84 -0
  11. data/lib/glimmer-dsl-swt.rb +1 -0
  12. data/lib/glimmer/data_binding/element_binding.rb +2 -1
  13. data/lib/glimmer/dsl/opal/checkbox_group_selection_data_binding_expression.rb +61 -0
  14. data/lib/glimmer/dsl/opal/custom_widget_expression.rb +7 -5
  15. data/lib/glimmer/dsl/opal/dsl.rb +4 -0
  16. data/lib/glimmer/dsl/opal/property_expression.rb +4 -3
  17. data/lib/glimmer/dsl/opal/radio_group_selection_data_binding_expression.rb +61 -0
  18. data/lib/glimmer/swt/button_proxy.rb +15 -1
  19. data/lib/glimmer/swt/checkbox_proxy.rb +80 -0
  20. data/lib/glimmer/swt/combo_proxy.rb +4 -4
  21. data/lib/glimmer/swt/custom/checkbox_group.rb +142 -0
  22. data/lib/glimmer/swt/custom/radio_group.rb +143 -0
  23. data/lib/glimmer/swt/grid_layout_proxy.rb +19 -8
  24. data/lib/glimmer/swt/group_proxy.rb +38 -0
  25. data/lib/glimmer/swt/label_proxy.rb +27 -7
  26. data/lib/glimmer/swt/layout_data_proxy.rb +31 -13
  27. data/lib/glimmer/swt/list_proxy.rb +2 -2
  28. data/lib/glimmer/swt/radio_proxy.rb +81 -0
  29. data/lib/glimmer/swt/row_layout_proxy.rb +32 -9
  30. data/lib/glimmer/swt/scrolled_composite_proxy.rb +20 -0
  31. data/lib/glimmer/swt/shell_proxy.rb +21 -9
  32. data/lib/glimmer/swt/widget_proxy.rb +46 -30
  33. metadata +15 -2
@@ -8,9 +8,10 @@ module Glimmer
8
8
  STYLE = <<~CSS
9
9
  .row-layout {
10
10
  display: flex;
11
+ align-items: flex-start;
11
12
  }
12
13
 
13
- .row-layout-pack {
14
+ .row-layout-pack-false {
14
15
  display: initial;
15
16
  }
16
17
 
@@ -18,8 +19,8 @@ module Glimmer
18
19
  flex-direction: row;
19
20
  }
20
21
 
21
- .row-layout-horizontal.row-layout-pack {
22
- flex-direction: none;
22
+ .row-layout-horizontal.row-layout-pack-false {
23
+ flex-direction: unset;
23
24
  }
24
25
 
25
26
  .row-layout-vertical {
@@ -27,11 +28,11 @@ module Glimmer
27
28
  }
28
29
 
29
30
  .row-layout-vertical.row-layout-pack {
30
- flex-direction: none;
31
+ flex-direction: none;
31
32
  }
32
33
  CSS
33
34
 
34
- attr_reader :type, :margin_width, :margin_height, :spacing, :pack
35
+ attr_reader :type, :margin_width, :margin_height, :margin_top, :margin_right, :margin_bottom, :margin_left, :spacing, :pack
35
36
 
36
37
  def initialize(parent, args)
37
38
  super(parent, args)
@@ -51,7 +52,7 @@ module Glimmer
51
52
  @type == :vertical
52
53
  end
53
54
 
54
- def dom(widget_dom)
55
+ def dom(widget_dom)
55
56
  dom_result = widget_dom
56
57
  dom_result += '<br />' if vertical? && @pack
57
58
  dom_result
@@ -60,9 +61,9 @@ module Glimmer
60
61
  def pack=(value)
61
62
  @pack = value
62
63
  if @pack
63
- @parent.dom_element.add_class('row-layout-pack')
64
+ @parent.dom_element.remove_class('row-layout-pack-false')
64
65
  else
65
- @parent.dom_element.remove_class('row-layout-pack')
66
+ @parent.dom_element.add_class('row-layout-pack-false')
66
67
  end
67
68
  end
68
69
 
@@ -79,6 +80,28 @@ module Glimmer
79
80
  @parent.dom_element.css('padding-bottom', @margin_height)
80
81
  end
81
82
 
83
+ def margin_top=(pixels)
84
+ @margin_top = pixels
85
+ # Using padding for width since margin-right isn't getting respected with width 100%
86
+ @parent.dom_element.css('padding-top', @margin_top)
87
+ end
88
+
89
+ def margin_right=(pixels)
90
+ @margin_right = pixels
91
+ @parent.dom_element.css('padding-right', @margin_right)
92
+ end
93
+
94
+ def margin_bottom=(pixels)
95
+ @margin_bottom = pixels
96
+ # Using padding for width since margin-right isn't getting respected with width 100%
97
+ @parent.dom_element.css('padding-bottom', @margin_bottom)
98
+ end
99
+
100
+ def margin_left=(pixels)
101
+ @margin_left = pixels
102
+ @parent.dom_element.css('padding-left', @margin_left)
103
+ end
104
+
82
105
  def spacing=(spacing)
83
106
  @spacing = spacing.to_i
84
107
  # TODO implement changes to accomodate layout_data in the future
@@ -89,7 +112,7 @@ module Glimmer
89
112
  elsif vertical?
90
113
  margin_bottom "#{@spacing}px"
91
114
  end
92
- }
115
+ }
93
116
  s("##{@parent.id} > :last-child") {
94
117
  if horizontal?
95
118
  margin_right 0
@@ -0,0 +1,20 @@
1
+ require 'glimmer/swt/grid_layout_proxy'
2
+ require 'glimmer/swt/widget_proxy'
3
+
4
+ module Glimmer
5
+ module SWT
6
+ class ScrolledCompositeProxy < CompositeProxy
7
+ STYLE = <<~CSS
8
+ .scrolled-composite {
9
+ }
10
+ CSS
11
+
12
+ # TODO set overflow-y and overflow-x based on :v_scroll and :h_scroll styles.... though consider also that it might not be needed in web browsers where scrollbars are always present
13
+ # height: 100px;
14
+ # overflow-y: auto;
15
+
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -54,7 +54,7 @@ module Glimmer
54
54
  .selected, .tabs .tab.selected {
55
55
  background: rgb(80, 116, 211);
56
56
  color: white;
57
- }
57
+ }
58
58
  CSS
59
59
  end
60
60
 
@@ -122,11 +122,11 @@ module Glimmer
122
122
  /* Create an selected/current tablink class */
123
123
  .tabs .tab.selected {
124
124
  background-color: #ccc;
125
- }
125
+ }
126
126
  /* Change background color of buttons on hover */
127
127
  .tabs .tab:hover {
128
128
  background-color: #ddd;
129
- }
129
+ }
130
130
  /* Style the tab content */
131
131
  .tab-item {
132
132
  padding: 6px 12px;
@@ -190,14 +190,14 @@ module Glimmer
190
190
  end
191
191
 
192
192
  def style_dom_table_css
193
- <<~CSS
193
+ <<~CSS
194
194
  table {
195
195
  border-spacing: 0;
196
196
  }
197
197
 
198
198
  table tr th,td {
199
199
  cursor: default;
200
- }
200
+ }
201
201
  CSS
202
202
  end
203
203
 
@@ -218,14 +218,14 @@ module Glimmer
218
218
  }
219
219
  style(class: 'tab-style') {
220
220
  style_dom_tab_css
221
- }
221
+ }
222
222
  # style(class: 'tab-item-style') {
223
223
  # style_dom_tab_item_css
224
- # }
224
+ # }
225
225
  # style(class: 'modal-style') {
226
226
  # style_dom_modal_css
227
- # }
228
- style(class: 'table-style') {
227
+ # }
228
+ style(class: 'table-style') {
229
229
  style_dom_table_css
230
230
  }
231
231
  style(class: 'fill-layout-style') {
@@ -234,6 +234,18 @@ module Glimmer
234
234
  style(class: 'row-layout-style') {
235
235
  Glimmer::SWT::RowLayoutProxy::STYLE
236
236
  }
237
+ style(class: 'grid-layout-style') {
238
+ Glimmer::SWT::GridLayoutProxy::STYLE
239
+ }
240
+ style(class: 'checkbox-style') {
241
+ Glimmer::SWT::CheckboxProxy::STYLE
242
+ }
243
+ style(class: 'radio-style') {
244
+ Glimmer::SWT::RadioProxy::STYLE
245
+ }
246
+ style(class: 'scrolled-composite-style') {
247
+ Glimmer::SWT::ScrolledCompositeProxy::STYLE
248
+ }
237
249
  }
238
250
  }.to_s
239
251
  end
@@ -1,5 +1,5 @@
1
1
  # Copyright (c) 2020 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
@@ -29,13 +29,13 @@ module Glimmer
29
29
  include Glimmer
30
30
  include PropertyOwner
31
31
 
32
- attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font
32
+ attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font, :focus
33
33
 
34
34
  class << self
35
35
  # Factory Method that translates a Glimmer DSL keyword into a WidgetProxy object
36
36
  def for(keyword, parent, args)
37
37
  the_widget_class = widget_class(keyword)
38
- the_widget_class.new(parent, args)
38
+ the_widget_class.respond_to?(:create) ? the_widget_class.create(parent, args) : the_widget_class.new(parent, args)
39
39
  end
40
40
 
41
41
  def widget_class(keyword)
@@ -69,7 +69,7 @@ module Glimmer
69
69
 
70
70
  def underscored_widget_name(widget_proxy)
71
71
  widget_proxy.class.name.split(/::|\./).last.sub(/Proxy$/, '').underscore
72
- end
72
+ end
73
73
  end
74
74
 
75
75
  DEFAULT_INITIALIZERS = {
@@ -95,27 +95,27 @@ module Glimmer
95
95
  # "group" => lambda do |group_proxy|
96
96
  # group_proxy.layout = GridLayoutProxy.new(group_proxy, []) if group.layout.nil?
97
97
  # end,
98
- }
98
+ }
99
99
 
100
100
  def initialize(parent, args)
101
- @parent = parent
101
+ @parent = parent
102
102
  @args = args
103
103
  @children = Set.new # TODO consider moving to composite
104
104
  @enabled = true
105
105
  DEFAULT_INITIALIZERS[self.class.underscored_widget_name(self)]&.call(self)
106
- @parent.add_child(self) # TODO rename to post_initialize_child to be closer to glimmer-dsl-swt terminology
106
+ @parent.add_child(self) # TODO rename to post_initialize_child to be closer to glimmer-dsl-swt terminology
107
107
  end
108
108
 
109
109
  def css_classes
110
110
  dom_element.attr('class').to_s.split
111
- end
111
+ end
112
112
 
113
113
  def dispose
114
114
  Document.find(path).remove
115
115
  end
116
116
 
117
117
  def path
118
- "#{parent_path} > #{element}##{id}.#{name}"
118
+ "#{parent_path} #{element}##{id}.#{name}"
119
119
  end
120
120
 
121
121
  # Root element representing widget. Must be overridden by subclasses if different from div
@@ -151,6 +151,16 @@ module Glimmer
151
151
  dom_element.css('font-size', "#{@font.height}px") unless @font.nil?
152
152
  end
153
153
 
154
+ def focus=(value)
155
+ @focus = value
156
+ dom_element.focus # TODO consider if a delay or async_exec is needed here
157
+ end
158
+
159
+ def set_focus
160
+ self.focus = true
161
+ end
162
+ alias setFocus set_focus
163
+
154
164
  def parent_path
155
165
  @parent.path
156
166
  end
@@ -172,14 +182,14 @@ module Glimmer
172
182
  end
173
183
  children.each do |child|
174
184
  child.render
175
- end
185
+ end
176
186
  end
177
187
  alias redraw render
178
188
 
179
189
  def build_dom
180
190
  @dom = nil
181
191
  @dom = dom
182
- @dom = @parent.layout.dom(@dom) if @parent.respond_to?(:layout) && @parent.layout
192
+ @dom = @parent.layout.dom(@dom) if @parent.respond_to?(:layout) && @parent.layout
183
193
  end
184
194
 
185
195
  def content(&block)
@@ -234,6 +244,7 @@ module Glimmer
234
244
  end
235
245
 
236
246
  def dom_element
247
+ # TODO consider making this pick an element in relation to its parent, allowing unhooked dom elements to be built if needed (unhooked to the visible page dom)
237
248
  Document.find(path)
238
249
  end
239
250
 
@@ -260,10 +271,10 @@ module Glimmer
260
271
  end
261
272
 
262
273
  def listener_dom_element
263
- Document.find(listener_path)
274
+ Document.find(listener_path)
264
275
  end
265
276
 
266
- def can_handle_observation_request?(observation_request)
277
+ def can_handle_observation_request?(observation_request)
267
278
  # TODO sort this out for Opal
268
279
  observation_request = observation_request.to_s
269
280
  if observation_request.start_with?('on_swt_')
@@ -274,15 +285,15 @@ module Glimmer
274
285
  # can_add_listener?(event) || can_handle_drag_observation_request?(observation_request) || can_handle_drop_observation_request?(observation_request)
275
286
  true # TODO filter by valid listeners only in the future
276
287
  end
277
- end
288
+ end
278
289
 
279
- def handle_observation_request(keyword, &event_listener)
290
+ def handle_observation_request(keyword, &event_listener)
280
291
  return unless observation_request_to_event_mapping.keys.include?(keyword)
281
292
  @observation_requests ||= {}
282
293
  @observation_requests[keyword] ||= Set.new
283
294
  event = nil
284
295
  delegate = nil
285
- [observation_request_to_event_mapping[keyword]].flatten.each do |mapping|
296
+ [observation_request_to_event_mapping[keyword]].flatten.each do |mapping|
286
297
  @observation_requests[keyword] << event_listener
287
298
  event = mapping[:event]
288
299
  event_handler = mapping[:event_handler]
@@ -357,9 +368,9 @@ module Glimmer
357
368
  # value
358
369
  # end
359
370
  # end,
360
- # :items => lambda do |value|
361
- # value.to_java :string
362
- # end,
371
+ :items => lambda do |value|
372
+ value.to_java :string
373
+ end,
363
374
  :text => lambda do |value|
364
375
  # if swt_widget.is_a?(Browser)
365
376
  # value.to_s
@@ -370,8 +381,8 @@ module Glimmer
370
381
  # :visible => lambda do |value|
371
382
  # !!value
372
383
  # end,
373
- }
374
- end
384
+ }
385
+ end
375
386
 
376
387
  def widget_property_listener_installers
377
388
  @swt_widget_property_listener_installers ||= {
@@ -450,13 +461,13 @@ module Glimmer
450
461
  # }
451
462
  # end,
452
463
  # },
453
- # Button => { #radio?
454
- # :selection => lambda do |observer|
455
- # on_widget_selected { |selection_event|
456
- # observer.call(getSelection)
457
- # }
458
- # end
459
- # },
464
+ RadioProxy => { #radio?
465
+ :selection => lambda do |observer|
466
+ on_widget_selected { |selection_event|
467
+ observer.call(selection)
468
+ }
469
+ end
470
+ },
460
471
  # Java::OrgEclipseSwtWidgets::MenuItem => {
461
472
  # :selection => lambda do |observer|
462
473
  # on_widget_selected { |selection_event|
@@ -481,15 +492,20 @@ end
481
492
  require 'glimmer/swt/browser_proxy'
482
493
  require 'glimmer/swt/button_proxy'
483
494
  require 'glimmer/swt/combo_proxy'
495
+ require 'glimmer/swt/checkbox_proxy'
484
496
  require 'glimmer/swt/composite_proxy'
497
+ require 'glimmer/swt/group_proxy'
485
498
  require 'glimmer/swt/label_proxy'
486
499
  require 'glimmer/swt/list_proxy'
500
+ require 'glimmer/swt/radio_proxy'
487
501
  require 'glimmer/swt/tab_folder_proxy'
488
502
  require 'glimmer/swt/tab_item_proxy'
489
503
  require 'glimmer/swt/table_column_proxy'
490
504
  require 'glimmer/swt/table_item_proxy'
491
505
  require 'glimmer/swt/table_proxy'
492
506
  require 'glimmer/swt/text_proxy'
507
+ require 'glimmer/swt/radio_proxy'
508
+ require 'glimmer/swt/scrolled_composite_proxy'
493
509
  require 'glimmer/swt/styled_text_proxy'
494
510
 
495
511
  require 'glimmer/dsl/opal/widget_expression'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-15 00:00:00.000000000 Z
11
+ date: 2020-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -221,13 +221,18 @@ files:
221
221
  - lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/board.rb
222
222
  - lib/glimmer-dsl-opal/samples/elaborate/tic_tac_toe/cell.rb
223
223
  - lib/glimmer-dsl-opal/samples/hello/hello_browser.rb
224
+ - lib/glimmer-dsl-opal/samples/hello/hello_checkbox.rb
225
+ - lib/glimmer-dsl-opal/samples/hello/hello_checkbox_group.rb
224
226
  - lib/glimmer-dsl-opal/samples/hello/hello_combo.rb
225
227
  - lib/glimmer-dsl-opal/samples/hello/hello_computed.rb
226
228
  - lib/glimmer-dsl-opal/samples/hello/hello_computed/contact.rb
227
229
  - lib/glimmer-dsl-opal/samples/hello/hello_custom_shell.rb
228
230
  - lib/glimmer-dsl-opal/samples/hello/hello_custom_widget.rb
231
+ - lib/glimmer-dsl-opal/samples/hello/hello_group.rb
229
232
  - lib/glimmer-dsl-opal/samples/hello/hello_list_multi_selection.rb
230
233
  - lib/glimmer-dsl-opal/samples/hello/hello_list_single_selection.rb
234
+ - lib/glimmer-dsl-opal/samples/hello/hello_radio.rb
235
+ - lib/glimmer-dsl-opal/samples/hello/hello_radio_group.rb
231
236
  - lib/glimmer-dsl-opal/samples/hello/hello_tab.rb
232
237
  - lib/glimmer-dsl-opal/samples/hello/hello_world.rb
233
238
  - lib/glimmer-dsl-opal/vendor/jquery.js
@@ -239,6 +244,7 @@ files:
239
244
  - lib/glimmer/data_binding/table_items_binding.rb
240
245
  - lib/glimmer/dsl/opal/async_exec_expression.rb
241
246
  - lib/glimmer/dsl/opal/bind_expression.rb
247
+ - lib/glimmer/dsl/opal/checkbox_group_selection_data_binding_expression.rb
242
248
  - lib/glimmer/dsl/opal/color_expression.rb
243
249
  - lib/glimmer/dsl/opal/column_properties_expression.rb
244
250
  - lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb
@@ -254,6 +260,7 @@ files:
254
260
  - lib/glimmer/dsl/opal/message_box_expression.rb
255
261
  - lib/glimmer/dsl/opal/observe_expression.rb
256
262
  - lib/glimmer/dsl/opal/property_expression.rb
263
+ - lib/glimmer/dsl/opal/radio_group_selection_data_binding_expression.rb
257
264
  - lib/glimmer/dsl/opal/rgb_expression.rb
258
265
  - lib/glimmer/dsl/opal/rgba_expression.rb
259
266
  - lib/glimmer/dsl/opal/shell_expression.rb
@@ -267,14 +274,18 @@ files:
267
274
  - lib/glimmer/swt.rb
268
275
  - lib/glimmer/swt/browser_proxy.rb
269
276
  - lib/glimmer/swt/button_proxy.rb
277
+ - lib/glimmer/swt/checkbox_proxy.rb
270
278
  - lib/glimmer/swt/color_proxy.rb
271
279
  - lib/glimmer/swt/combo_proxy.rb
272
280
  - lib/glimmer/swt/composite_proxy.rb
281
+ - lib/glimmer/swt/custom/checkbox_group.rb
282
+ - lib/glimmer/swt/custom/radio_group.rb
273
283
  - lib/glimmer/swt/display_proxy.rb
274
284
  - lib/glimmer/swt/event_listener_proxy.rb
275
285
  - lib/glimmer/swt/fill_layout_proxy.rb
276
286
  - lib/glimmer/swt/font_proxy.rb
277
287
  - lib/glimmer/swt/grid_layout_proxy.rb
288
+ - lib/glimmer/swt/group_proxy.rb
278
289
  - lib/glimmer/swt/label_proxy.rb
279
290
  - lib/glimmer/swt/layout_data_proxy.rb
280
291
  - lib/glimmer/swt/layout_proxy.rb
@@ -283,7 +294,9 @@ files:
283
294
  - lib/glimmer/swt/message_box_proxy.rb
284
295
  - lib/glimmer/swt/point.rb
285
296
  - lib/glimmer/swt/property_owner.rb
297
+ - lib/glimmer/swt/radio_proxy.rb
286
298
  - lib/glimmer/swt/row_layout_proxy.rb
299
+ - lib/glimmer/swt/scrolled_composite_proxy.rb
287
300
  - lib/glimmer/swt/shell_proxy.rb
288
301
  - lib/glimmer/swt/style_constantizable.rb
289
302
  - lib/glimmer/swt/styled_text_proxy.rb