glimmer-dsl-opal 0.1.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +48 -0
  3. data/README.md +948 -169
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal.rb +31 -7
  6. data/lib/glimmer-dsl-opal/ext/date.rb +13 -0
  7. data/lib/glimmer-dsl-opal/ext/exception.rb +5 -0
  8. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager.rb +0 -0
  9. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact.rb +0 -0
  10. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact_manager_presenter.rb +0 -0
  11. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/contact_manager/contact_repository.rb +24 -99
  12. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/login.rb +0 -0
  13. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe.rb +0 -0
  14. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe/board.rb +0 -0
  15. data/lib/{samples → glimmer-dsl-opal/samples}/elaborate/tic_tac_toe/cell.rb +0 -0
  16. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_browser.rb +0 -0
  17. data/lib/glimmer-dsl-opal/samples/hello/hello_checkbox.rb +85 -0
  18. data/lib/glimmer-dsl-opal/samples/hello/hello_checkbox_group.rb +68 -0
  19. data/lib/glimmer-dsl-opal/samples/hello/hello_combo.rb +63 -0
  20. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_computed.rb +0 -0
  21. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_computed/contact.rb +0 -0
  22. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_shell.rb +155 -0
  23. data/lib/glimmer-dsl-opal/samples/hello/hello_custom_widget.rb +86 -0
  24. data/lib/glimmer-dsl-opal/samples/hello/hello_group.rb +104 -0
  25. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_list_multi_selection.rb +0 -0
  26. data/lib/{samples → glimmer-dsl-opal/samples}/hello/hello_list_single_selection.rb +1 -1
  27. data/lib/glimmer-dsl-opal/samples/hello/hello_radio.rb +108 -0
  28. data/lib/glimmer-dsl-opal/samples/hello/hello_radio_group.rb +84 -0
  29. data/lib/glimmer-dsl-opal/samples/hello/hello_tab.rb +50 -0
  30. data/lib/glimmer-dsl-opal/samples/hello/hello_world.rb +29 -0
  31. data/lib/{jquery.js → glimmer-dsl-opal/vendor/jquery.js} +0 -0
  32. data/lib/glimmer-dsl-swt.rb +37 -0
  33. data/lib/glimmer/data_binding/element_binding.rb +2 -1
  34. data/lib/glimmer/data_binding/ext/observable_model.rb +1 -1
  35. data/lib/glimmer/dsl/opal/async_exec_expression.rb +23 -7
  36. data/lib/glimmer/dsl/opal/checkbox_group_selection_data_binding_expression.rb +61 -0
  37. data/lib/glimmer/dsl/opal/color_expression.rb +38 -0
  38. data/lib/glimmer/dsl/opal/custom_widget_expression.rb +94 -0
  39. data/lib/glimmer/dsl/opal/display_expression.rb +40 -0
  40. data/lib/glimmer/dsl/opal/dsl.rb +14 -0
  41. data/lib/glimmer/dsl/opal/exec_expression.rb +55 -0
  42. data/lib/glimmer/dsl/opal/font_expression.rb +47 -0
  43. data/lib/glimmer/dsl/opal/layout_expression.rb +1 -1
  44. data/lib/glimmer/dsl/opal/property_expression.rb +6 -2
  45. data/lib/glimmer/dsl/opal/radio_group_selection_data_binding_expression.rb +61 -0
  46. data/lib/glimmer/dsl/opal/rgb_expression.rb +32 -0
  47. data/lib/glimmer/dsl/opal/rgba_expression.rb +32 -0
  48. data/lib/glimmer/dsl/opal/shell_expression.rb +19 -2
  49. data/lib/glimmer/dsl/opal/swt_expression.rb +46 -0
  50. data/lib/glimmer/dsl/opal/sync_exec_expression.rb +33 -0
  51. data/lib/glimmer/dsl/opal/widget_expression.rb +2 -1
  52. data/lib/glimmer/dsl/opal/widget_listener_expression.rb +16 -3
  53. data/lib/glimmer/swt.rb +499 -0
  54. data/lib/glimmer/swt/browser_proxy.rb +1 -1
  55. data/lib/glimmer/swt/button_proxy.rb +17 -3
  56. data/lib/glimmer/swt/checkbox_proxy.rb +80 -0
  57. data/lib/glimmer/swt/color_proxy.rb +119 -0
  58. data/lib/glimmer/swt/combo_proxy.rb +13 -12
  59. data/lib/glimmer/swt/composite_proxy.rb +8 -8
  60. data/lib/glimmer/swt/custom/checkbox_group.rb +142 -0
  61. data/lib/glimmer/swt/custom/radio_group.rb +143 -0
  62. data/lib/glimmer/swt/display_proxy.rb +79 -0
  63. data/lib/glimmer/swt/fill_layout_proxy.rb +84 -0
  64. data/lib/glimmer/swt/font_proxy.rb +79 -0
  65. data/lib/glimmer/swt/grid_layout_proxy.rb +45 -4
  66. data/lib/glimmer/swt/group_proxy.rb +38 -0
  67. data/lib/glimmer/swt/label_proxy.rb +28 -4
  68. data/lib/glimmer/swt/layout_data_proxy.rb +59 -6
  69. data/lib/glimmer/swt/layout_proxy.rb +17 -14
  70. data/lib/glimmer/swt/list_proxy.rb +19 -14
  71. data/lib/glimmer/swt/make_shift_shell_proxy.rb +38 -0
  72. data/lib/glimmer/swt/message_box_proxy.rb +5 -8
  73. data/lib/glimmer/swt/radio_proxy.rb +81 -0
  74. data/lib/glimmer/swt/row_layout_proxy.rb +128 -0
  75. data/lib/glimmer/swt/scrolled_composite_proxy.rb +20 -0
  76. data/lib/glimmer/swt/shell_proxy.rb +51 -26
  77. data/lib/glimmer/swt/style_constantizable.rb +154 -0
  78. data/lib/glimmer/swt/styled_text_proxy.rb +44 -0
  79. data/lib/glimmer/swt/swt_proxy.rb +53 -0
  80. data/lib/glimmer/swt/tab_folder_proxy.rb +8 -8
  81. data/lib/glimmer/swt/tab_item_proxy.rb +15 -32
  82. data/lib/glimmer/swt/table_proxy.rb +0 -18
  83. data/lib/glimmer/swt/widget_proxy.rb +173 -54
  84. data/lib/glimmer/ui/custom_shell.rb +92 -0
  85. data/lib/glimmer/ui/custom_widget.rb +292 -0
  86. data/lib/glimmer/util/proc_tracker.rb +39 -0
  87. data/lib/net/http.rb +17 -0
  88. data/lib/uri.rb +64 -0
  89. metadata +108 -57
  90. data/lib/glimmer/opal/display_proxy.rb +0 -23
  91. data/lib/glimmer/opal/element_proxy.rb +0 -312
  92. data/lib/samples/elaborate/launch +0 -6
  93. data/lib/samples/hello/hello_combo.rb +0 -34
  94. data/lib/samples/hello/hello_tab.rb +0 -24
  95. data/lib/samples/hello/hello_world.rb +0 -8
  96. data/lib/samples/hello/launch +0 -10
  97. data/lib/samples/launch +0 -4
@@ -0,0 +1,44 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+ require 'glimmer/swt/text_proxy'
3
+ require 'glimmer/swt/swt_proxy'
4
+
5
+ module Glimmer
6
+ module SWT
7
+ class StyledTextProxy < TextProxy
8
+ attr_reader :alignment, :right_margin, :editable, :caret
9
+
10
+ def alignment=(value)
11
+ @alignment = %w[left center right].detect {|alignment_value| SWTProxy[alignment_value] == value}
12
+ dom_element.css('text-align', @alignment)
13
+ end
14
+
15
+ def right_margin=(value)
16
+ @right_margin = value.to_i
17
+ dom_element.css('padding-right', @right_margin)
18
+ end
19
+
20
+ def editable=(value)
21
+ @editable = value
22
+ if !@editable
23
+ dom_element.attr('disabled', true)
24
+ dom_element.css('background', :white)
25
+ dom_element.css('border', 'solid 1px rgb(118, 118, 118)')
26
+ dom_element.css('border-radius', '3px')
27
+ # :hover {
28
+ # border-color: rgb(80, 80, 80);
29
+ # }
30
+ else
31
+ dom_element.prop('disabled', false)
32
+ dom_element.css('background', nil)
33
+ dom_element.css('border', nil)
34
+ dom_element.css('border-radius', nil)
35
+ end
36
+ end
37
+
38
+ def caret=(value)
39
+ @caret = value
40
+ # TODO implement (not needed for disabling caret though)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (c) 2020 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'
23
+ require 'glimmer/swt/style_constantizable'
24
+
25
+ module Glimmer
26
+ module SWT
27
+ # Proxy for org.eclipse.swt.SWT
28
+ #
29
+ # Follows the Proxy Design Pattern
30
+ class SWTProxy
31
+ include StyleConstantizable
32
+
33
+ class << self
34
+ def constant_source_class
35
+ SWT
36
+ end
37
+
38
+ def constant_value_none
39
+ SWT::NONE
40
+ end
41
+
42
+ def extra_styles
43
+ EXTRA_STYLES
44
+ end
45
+ end
46
+
47
+ EXTRA_STYLES = {
48
+ NO_RESIZE: self[:shell_trim, :resize!, :max!],
49
+ NO_SORT: -7,
50
+ }
51
+ end
52
+ end
53
+ end
@@ -12,20 +12,16 @@ module Glimmer
12
12
 
13
13
  def add_child(child)
14
14
  unless @children.include?(child)
15
- @children << child
15
+ @children << child
16
+ tabs_dom_element.append(child.tab_dom)
17
+ child.render
16
18
  end
19
+
17
20
  if @children.size == 1
18
21
  child.show
19
22
  end
20
23
  end
21
24
 
22
- def redraw
23
- super()
24
- @children.each do |child|
25
- add_child(child) # TODO think of impact of this on performance
26
- end
27
- end
28
-
29
25
  def hide_all_tab_content
30
26
  @children.each(&:hide)
31
27
  end
@@ -38,6 +34,10 @@ module Glimmer
38
34
  id + '-tabs'
39
35
  end
40
36
 
37
+ def tabs_dom_element
38
+ Document.find(tabs_path)
39
+ end
40
+
41
41
  def dom
42
42
  tab_folder_id = id
43
43
  tab_folder_id_style = css
@@ -8,7 +8,6 @@ module Glimmer
8
8
 
9
9
  def initialize(parent, args)
10
10
  super(parent, args)
11
- css_classes << 'tab-item'
12
11
  content {
13
12
  on_widget_selected {
14
13
  @parent.hide_all_tab_content
@@ -18,22 +17,20 @@ module Glimmer
18
17
  end
19
18
 
20
19
  def show
21
- # TODO refactor/rewrite via simply class application in jquery
22
- # Document.find(path).remove_class('hide')
23
20
  @content_visible = true
24
- redraw
21
+ dom_element.remove_class('hide')
22
+ tab_dom_element.add_class('selected')
25
23
  end
26
24
 
27
25
  def hide
28
- # TODO refactor/rewrite via simply class application in jquery
29
- # Document.find(path).add_class('hide')
30
26
  @content_visible = false
31
- redraw
27
+ dom_element.add_class('hide')
28
+ tab_dom_element.remove_class('selected')
32
29
  end
33
30
 
34
31
  def text=(value)
35
32
  @text = value
36
- redraw
33
+ tab_dom_element.html(@text)
37
34
  end
38
35
 
39
36
  def selector
@@ -52,47 +49,33 @@ module Glimmer
52
49
  tab_path
53
50
  end
54
51
 
55
- def redraw
56
- if @tab_dom
57
- old_tab_dom = @tab_dom
58
- @tab_dom = nil
59
- Document.find(tab_path).replace_with(tab_dom)
60
- else
61
- Document.find(parent.tabs_path).append(tab_dom)
62
- end
63
- super()
64
- end
65
-
66
52
  def tab_path
67
53
  "#{parent.tabs_path} > ##{tab_id}"
68
54
  end
69
55
 
56
+ def tab_dom_element
57
+ Document.find(tab_path)
58
+ end
59
+
70
60
  def tab_id
71
61
  id + '-tab'
72
62
  end
73
63
 
64
+ # This contains the clickable tab area with tab names
74
65
  def tab_dom
75
- tab_selected = @content_visible ? 'selected' : ''
76
66
  @tab_dom ||= html {
77
- button(id: tab_id, class: "tab #{tab_selected}") {
67
+ button(id: tab_id, class: "tab") {
78
68
  @text
79
69
  }
80
70
  }.to_s
81
71
  end
82
72
 
73
+ # This contains the tab content
83
74
  def dom
84
- tab_item_id = id
85
- tab_item_id_style = css
86
- tab_item_css_classes = css_classes
87
- css_classes << name
88
- if @content_visible
89
- tab_item_css_classes.delete('hide')
90
- else
91
- tab_item_css_classes << 'hide'
92
- end
93
- tab_item_class_string = tab_item_css_classes.to_a.join(' ')
75
+ tab_item_id = id
76
+ tab_item_class_string = [name, 'hide'].join(' ')
94
77
  @dom ||= html {
95
- div(id: tab_item_id, style: tab_item_id_style, class: tab_item_class_string) {
78
+ div(id: tab_item_id, class: tab_item_class_string) {
96
79
  }
97
80
  }.to_s
98
81
  end
@@ -105,24 +105,6 @@ module Glimmer
105
105
  @columns.to_a.each(&:redraw)
106
106
  end
107
107
 
108
- # def redraw
109
- # if @dom
110
- # old_dom = @dom
111
- # @dom = nil
112
- # old_dom.replace dom
113
- # else
114
- # dom
115
- # end
116
- # if @last_redrawn_children != @children
117
- # items_dom_element.empty
118
- # @last_redrawn_children = @children
119
- # @children = []
120
- # @last_redrawn_children.each do |child|
121
- # add_child(child)
122
- # end
123
- # end
124
- # end
125
-
126
108
  def element
127
109
  'table'
128
110
  end
@@ -1,5 +1,27 @@
1
+ # Copyright (c) 2020 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
+
1
22
  require 'glimmer/swt/event_listener_proxy'
2
23
  require 'glimmer/swt/property_owner'
24
+ require 'glimmer/swt/swt_proxy'
3
25
 
4
26
  module Glimmer
5
27
  module SWT
@@ -7,13 +29,13 @@ module Glimmer
7
29
  include Glimmer
8
30
  include PropertyOwner
9
31
 
10
- attr_reader :parent, :args, :path, :css_classes, :css, :children, :enabled
32
+ attr_reader :parent, :args, :path, :children, :enabled, :foreground, :background, :font, :focus
11
33
 
12
34
  class << self
13
35
  # Factory Method that translates a Glimmer DSL keyword into a WidgetProxy object
14
36
  def for(keyword, parent, args)
15
- the_widget_class = widget_class(keyword) || Glimmer::SWT::LabelProxy
16
- the_widget_class.new(parent, args)
37
+ the_widget_class = widget_class(keyword)
38
+ the_widget_class.respond_to?(:create) ? the_widget_class.create(parent, args) : the_widget_class.new(parent, args)
17
39
  end
18
40
 
19
41
  def widget_class(keyword)
@@ -44,16 +66,48 @@ module Glimmer
44
66
  def reset_max_id_numbers!
45
67
  @max_id_numbers = {}
46
68
  end
69
+
70
+ def underscored_widget_name(widget_proxy)
71
+ widget_proxy.class.name.split(/::|\./).last.sub(/Proxy$/, '').underscore
72
+ end
47
73
  end
48
74
 
75
+ DEFAULT_INITIALIZERS = {
76
+ "composite" => lambda do |composite_proxy|
77
+ if composite_proxy.layout.nil?
78
+ layout = GridLayoutProxy.new(composite_proxy, [])
79
+ composite_proxy.layout = layout
80
+ layout.margin_width = 15
81
+ layout.margin_height = 15
82
+ end
83
+ end,
84
+ # "scrolled_composite" => lambda do |scrolled_composite|
85
+ # scrolled_composite.expand_horizontal = true
86
+ # scrolled_composite.expand_vertical = true
87
+ # end,
88
+ # "table" => lambda do |table|
89
+ # table.setHeaderVisible(true)
90
+ # table.setLinesVisible(true)
91
+ # end,
92
+ "table_column" => lambda do |table_column_proxy|
93
+ table_column_proxy.width = 80
94
+ end,
95
+ # "group" => lambda do |group_proxy|
96
+ # group_proxy.layout = GridLayoutProxy.new(group_proxy, []) if group.layout.nil?
97
+ # end,
98
+ }
99
+
49
100
  def initialize(parent, args)
50
- @parent = parent
101
+ @parent = parent
51
102
  @args = args
52
- @children = Set.new
53
- @css_classes = Set.new
54
- @css = ''
103
+ @children = Set.new # TODO consider moving to composite
55
104
  @enabled = true
56
- @parent.add_child(self)
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
107
+ end
108
+
109
+ def css_classes
110
+ dom_element.attr('class').to_s.split
57
111
  end
58
112
 
59
113
  def dispose
@@ -61,7 +115,7 @@ module Glimmer
61
115
  end
62
116
 
63
117
  def path
64
- "#{parent_path} > #{element}##{id}.#{name}"
118
+ "#{parent_path} #{element}##{id}.#{name}"
65
119
  end
66
120
 
67
121
  # Root element representing widget. Must be overridden by subclasses if different from div
@@ -71,28 +125,54 @@ module Glimmer
71
125
 
72
126
  def add_child(child)
73
127
  @children << child
74
- child.redraw
128
+ child.render
75
129
  end
76
130
 
77
131
  def enabled=(value)
78
132
  @enabled = value
79
- # TODO consider relying less on redraw in setters in the future
80
- redraw
133
+ dom_element.prop('disabled', !@enabled)
134
+ end
135
+
136
+ def foreground=(value)
137
+ @foreground = value
138
+ dom_element.css('color', foreground.to_css) unless foreground.nil?
139
+ end
140
+
141
+ def background=(value)
142
+ @background = value
143
+ dom_element.css('background-color', background.to_css) unless background.nil?
81
144
  end
82
145
 
146
+ def font=(value)
147
+ @font = value.is_a?(FontProxy) ? value : FontProxy.new(self, value)
148
+ dom_element.css('font-family', @font.name) unless @font.nil?
149
+ dom_element.css('font-style', 'italic') if @font&.style == :italic
150
+ dom_element.css('font-weight', 'bold') if @font&.style == :bold
151
+ dom_element.css('font-size', "#{@font.height}px") unless @font.nil?
152
+ end
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
+
83
164
  def parent_path
84
165
  @parent.path
85
166
  end
86
167
 
87
- def redraw
88
- if @dom && !Document.find(path).empty?
89
- old_element = Document.find(path)
90
- old_dom = @dom
91
- @dom = nil
92
- old_element.replace_with(dom.gsub('<html>', '').gsub('</html>', ''))
168
+ def render
169
+ old_element = dom_element
170
+ brand_new = @dom.nil? || old_element.empty?
171
+ build_dom
172
+ if brand_new
173
+ Document.find(parent_path).append(@dom)
93
174
  else
94
- @dom = nil
95
- Document.find(parent_path).append(dom.gsub('<html>', '').gsub('</html>', ''))
175
+ old_element.replace_with(@dom)
96
176
  end
97
177
  @observation_requests&.clone&.each do |keyword, event_listener_set|
98
178
  event_listener_set.each do |event_listener|
@@ -101,9 +181,16 @@ module Glimmer
101
181
  end
102
182
  end
103
183
  children.each do |child|
104
- child.redraw
184
+ child.render
105
185
  end
106
186
  end
187
+ alias redraw render
188
+
189
+ def build_dom
190
+ @dom = nil
191
+ @dom = dom
192
+ @dom = @parent.layout.dom(@dom) if @parent.respond_to?(:layout) && @parent.layout
193
+ end
107
194
 
108
195
  def content(&block)
109
196
  Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Opal::WidgetExpression.new, &block)
@@ -133,33 +220,23 @@ module Glimmer
133
220
  end
134
221
 
135
222
  def add_css_class(css_class)
136
- @css_classes << css_class
137
- redraw
223
+ dom_element.add_class(css_class)
138
224
  end
139
225
 
140
- def add_css_classes(css_classes)
141
- @css_classes += css_classes
142
- redraw
226
+ def add_css_classes(css_classes_to_add)
227
+ css_classes_to_add.each {|css_class| add_css_class(css_class)}
143
228
  end
144
229
 
145
230
  def remove_css_class(css_class)
146
- @css_classes.delete(css_class)
147
- redraw
148
- end
149
-
150
- def remove_css_classes(css_classes)
151
- @css_classes -= css_classes
152
- redraw
231
+ dom_element.remove_class(css_class)
153
232
  end
154
233
 
155
- def clear_css_classes(css_class)
156
- @css_classes.clear
157
- redraw
234
+ def remove_css_classes(css_classes_to_remove)
235
+ css_classes_to_remove.each {|css_class| remove_css_class(css_class)}
158
236
  end
159
237
 
160
- def css=(css)
161
- @css = css
162
- redraw
238
+ def clear_css_classes
239
+ css_classes.each {|css_class| remove_css_class(css_class)}
163
240
  end
164
241
 
165
242
  def has_style?(symbol)
@@ -167,9 +244,24 @@ module Glimmer
167
244
  end
168
245
 
169
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)
170
248
  Document.find(path)
171
249
  end
172
250
 
251
+ def style_element
252
+ style_element_id = "#{id}-style"
253
+ style_element_selector = "style##{style_element_id}"
254
+ element = dom_element.find(style_element_selector)
255
+ if element.empty?
256
+ new_element = Element.new(:style)
257
+ new_element.attr('id', style_element_id)
258
+ new_element.attr('class', "#{name.gsub('_', '-')}-instance-style widget-instance-style")
259
+ dom_element.prepend(new_element)
260
+ element = dom_element.find(style_element_selector)
261
+ end
262
+ element
263
+ end
264
+
173
265
  def parent_dom_element
174
266
  Document.find(parent_path)
175
267
  end
@@ -178,6 +270,23 @@ module Glimmer
178
270
  path
179
271
  end
180
272
 
273
+ def listener_dom_element
274
+ Document.find(listener_path)
275
+ end
276
+
277
+ def can_handle_observation_request?(observation_request)
278
+ # TODO sort this out for Opal
279
+ observation_request = observation_request.to_s
280
+ if observation_request.start_with?('on_swt_')
281
+ constant_name = observation_request.sub(/^on_swt_/, '')
282
+ SWTProxy.has_constant?(constant_name)
283
+ elsif observation_request.start_with?('on_')
284
+ # event = observation_request.sub(/^on_/, '')
285
+ # can_add_listener?(event) || can_handle_drag_observation_request?(observation_request) || can_handle_drop_observation_request?(observation_request)
286
+ true # TODO filter by valid listeners only in the future
287
+ end
288
+ end
289
+
181
290
  def handle_observation_request(keyword, &event_listener)
182
291
  return unless observation_request_to_event_mapping.keys.include?(keyword)
183
292
  @observation_requests ||= {}
@@ -190,7 +299,7 @@ module Glimmer
190
299
  event_handler = mapping[:event_handler]
191
300
  potential_event_listener = event_handler&.call(event_listener)
192
301
  event_listener = potential_event_listener || event_listener
193
- delegate = Document.find(listener_path).on(event, &event_listener)
302
+ delegate = listener_dom_element.on(event, &event_listener)
194
303
  end
195
304
  # TODO update code below for new WidgetProxy API
196
305
  EventListenerProxy.new(element_proxy: self, event: event, selector: selector, delegate: delegate)
@@ -222,8 +331,15 @@ module Glimmer
222
331
  end
223
332
 
224
333
  def property_type_converters
334
+ color_converter = lambda do |value|
335
+ if value.is_a?(Symbol) || value.is_a?(String)
336
+ ColorProxy.new(value)
337
+ else
338
+ value
339
+ end
340
+ end
225
341
  @property_type_converters ||= {
226
- # :background => color_converter,
342
+ :background => color_converter,
227
343
  # :background_image => lambda do |value|
228
344
  # if value.is_a?(String)
229
345
  # if value.start_with?('uri:classloader')
@@ -243,7 +359,7 @@ module Glimmer
243
359
  # value
244
360
  # end
245
361
  # end,
246
- # :foreground => color_converter,
362
+ :foreground => color_converter,
247
363
  # :font => lambda do |value|
248
364
  # if value.is_a?(Hash)
249
365
  # font_properties = value
@@ -251,9 +367,6 @@ module Glimmer
251
367
  # else
252
368
  # value
253
369
  # end
254
- # end,
255
- # :items => lambda do |value|
256
- # value.to_java :string
257
370
  # end,
258
371
  :text => lambda do |value|
259
372
  # if swt_widget.is_a?(Browser)
@@ -265,8 +378,8 @@ module Glimmer
265
378
  # :visible => lambda do |value|
266
379
  # !!value
267
380
  # end,
268
- }
269
- end
381
+ }
382
+ end
270
383
 
271
384
  def widget_property_listener_installers
272
385
  @swt_widget_property_listener_installers ||= {
@@ -345,13 +458,13 @@ module Glimmer
345
458
  # }
346
459
  # end,
347
460
  # },
348
- # Button => { #radio?
349
- # :selection => lambda do |observer|
350
- # on_widget_selected { |selection_event|
351
- # observer.call(getSelection)
352
- # }
353
- # end
354
- # },
461
+ RadioProxy => { #radio?
462
+ :selection => lambda do |observer|
463
+ on_widget_selected { |selection_event|
464
+ observer.call(selection)
465
+ }
466
+ end
467
+ },
355
468
  # Java::OrgEclipseSwtWidgets::MenuItem => {
356
469
  # :selection => lambda do |observer|
357
470
  # on_widget_selected { |selection_event|
@@ -376,14 +489,20 @@ end
376
489
  require 'glimmer/swt/browser_proxy'
377
490
  require 'glimmer/swt/button_proxy'
378
491
  require 'glimmer/swt/combo_proxy'
492
+ require 'glimmer/swt/checkbox_proxy'
379
493
  require 'glimmer/swt/composite_proxy'
494
+ require 'glimmer/swt/group_proxy'
380
495
  require 'glimmer/swt/label_proxy'
381
496
  require 'glimmer/swt/list_proxy'
497
+ require 'glimmer/swt/radio_proxy'
382
498
  require 'glimmer/swt/tab_folder_proxy'
383
499
  require 'glimmer/swt/tab_item_proxy'
384
500
  require 'glimmer/swt/table_column_proxy'
385
501
  require 'glimmer/swt/table_item_proxy'
386
502
  require 'glimmer/swt/table_proxy'
387
503
  require 'glimmer/swt/text_proxy'
504
+ require 'glimmer/swt/radio_proxy'
505
+ require 'glimmer/swt/scrolled_composite_proxy'
506
+ require 'glimmer/swt/styled_text_proxy'
388
507
 
389
508
  require 'glimmer/dsl/opal/widget_expression'