glimmer-dsl-opal 0.0.9 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/README.md +999 -177
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal.rb +49 -10
  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 +1 -1
  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 +19 -19
  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 +0 -0
  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/glimmer-dsl-opal/vendor/jquery.js +2 -0
  32. data/lib/glimmer-dsl-swt.rb +37 -0
  33. data/lib/glimmer/data_binding/element_binding.rb +1 -0
  34. data/lib/glimmer/data_binding/ext/observable_model.rb +5 -5
  35. data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
  36. data/lib/glimmer/data_binding/table_items_binding.rb +3 -3
  37. data/lib/glimmer/dsl/opal/async_exec_expression.rb +23 -7
  38. data/lib/glimmer/dsl/opal/checkbox_group_selection_data_binding_expression.rb +61 -0
  39. data/lib/glimmer/dsl/opal/color_expression.rb +38 -0
  40. data/lib/glimmer/dsl/opal/column_properties_expression.rb +2 -2
  41. data/lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb +2 -2
  42. data/lib/glimmer/dsl/opal/custom_widget_expression.rb +94 -0
  43. data/lib/glimmer/dsl/opal/display_expression.rb +40 -0
  44. data/lib/glimmer/dsl/opal/dsl.rb +18 -16
  45. data/lib/glimmer/dsl/opal/exec_expression.rb +55 -0
  46. data/lib/glimmer/dsl/opal/font_expression.rb +47 -0
  47. data/lib/glimmer/dsl/opal/layout_data_expression.rb +2 -2
  48. data/lib/glimmer/dsl/opal/layout_expression.rb +22 -0
  49. data/lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb +2 -3
  50. data/lib/glimmer/dsl/opal/message_box_expression.rb +2 -2
  51. data/lib/glimmer/dsl/opal/property_expression.rb +6 -2
  52. data/lib/glimmer/dsl/opal/radio_group_selection_data_binding_expression.rb +61 -0
  53. data/lib/glimmer/dsl/opal/rgb_expression.rb +32 -0
  54. data/lib/glimmer/dsl/opal/rgba_expression.rb +32 -0
  55. data/lib/glimmer/dsl/opal/shell_expression.rb +20 -3
  56. data/lib/glimmer/dsl/opal/swt_expression.rb +46 -0
  57. data/lib/glimmer/dsl/opal/sync_exec_expression.rb +33 -0
  58. data/lib/glimmer/dsl/opal/table_expression.rb +2 -2
  59. data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +2 -2
  60. data/lib/glimmer/dsl/opal/widget_expression.rb +24 -0
  61. data/lib/glimmer/dsl/opal/widget_listener_expression.rb +16 -3
  62. data/lib/glimmer/swt.rb +499 -0
  63. data/lib/glimmer/swt/browser_proxy.rb +27 -0
  64. data/lib/glimmer/swt/button_proxy.rb +54 -0
  65. data/lib/glimmer/swt/checkbox_proxy.rb +80 -0
  66. data/lib/glimmer/swt/color_proxy.rb +119 -0
  67. data/lib/glimmer/{opal/select_proxy.rb → swt/combo_proxy.rb} +23 -18
  68. data/lib/glimmer/swt/composite_proxy.rb +31 -0
  69. data/lib/glimmer/swt/custom/checkbox_group.rb +142 -0
  70. data/lib/glimmer/swt/custom/radio_group.rb +143 -0
  71. data/lib/glimmer/swt/display_proxy.rb +79 -0
  72. data/lib/glimmer/{opal → swt}/event_listener_proxy.rb +1 -1
  73. data/lib/glimmer/swt/fill_layout_proxy.rb +84 -0
  74. data/lib/glimmer/swt/font_proxy.rb +79 -0
  75. data/lib/glimmer/swt/grid_layout_proxy.rb +82 -0
  76. data/lib/glimmer/swt/group_proxy.rb +38 -0
  77. data/lib/glimmer/swt/label_proxy.rb +54 -0
  78. data/lib/glimmer/swt/layout_data_proxy.rb +105 -0
  79. data/lib/glimmer/swt/layout_proxy.rb +63 -0
  80. data/lib/glimmer/{opal → swt}/list_proxy.rb +30 -22
  81. data/lib/glimmer/swt/make_shift_shell_proxy.rb +38 -0
  82. data/lib/glimmer/swt/message_box_proxy.rb +143 -0
  83. data/lib/glimmer/{opal → swt}/point.rb +1 -1
  84. data/lib/glimmer/{opal → swt}/property_owner.rb +1 -1
  85. data/lib/glimmer/swt/radio_proxy.rb +81 -0
  86. data/lib/glimmer/swt/row_layout_proxy.rb +128 -0
  87. data/lib/glimmer/swt/scrolled_composite_proxy.rb +20 -0
  88. data/lib/glimmer/swt/shell_proxy.rb +260 -0
  89. data/lib/glimmer/swt/style_constantizable.rb +154 -0
  90. data/lib/glimmer/swt/styled_text_proxy.rb +44 -0
  91. data/lib/glimmer/swt/swt_proxy.rb +53 -0
  92. data/lib/glimmer/{opal/tab_folder.rb → swt/tab_folder_proxy.rb} +20 -21
  93. data/lib/glimmer/swt/tab_item_proxy.rb +84 -0
  94. data/lib/glimmer/{opal/table_column.rb → swt/table_column_proxy.rb} +13 -7
  95. data/lib/glimmer/{opal/table_item.rb → swt/table_item_proxy.rb} +59 -48
  96. data/lib/glimmer/{opal → swt}/table_proxy.rb +66 -56
  97. data/lib/glimmer/swt/text_proxy.rb +46 -0
  98. data/lib/glimmer/swt/widget_proxy.rb +511 -0
  99. data/lib/glimmer/ui/custom_shell.rb +92 -0
  100. data/lib/glimmer/ui/custom_widget.rb +292 -0
  101. data/lib/glimmer/util/proc_tracker.rb +39 -0
  102. data/lib/net/http.rb +17 -0
  103. data/lib/uri.rb +64 -0
  104. metadata +142 -67
  105. data/lib/glimmer/dsl/opal/browser_expression.rb +0 -17
  106. data/lib/glimmer/dsl/opal/button_expression.rb +0 -18
  107. data/lib/glimmer/dsl/opal/combo_expression.rb +0 -17
  108. data/lib/glimmer/dsl/opal/composite_expression.rb +0 -17
  109. data/lib/glimmer/dsl/opal/grid_layout_expression.rb +0 -17
  110. data/lib/glimmer/dsl/opal/label_expression.rb +0 -17
  111. data/lib/glimmer/dsl/opal/list_expression.rb +0 -17
  112. data/lib/glimmer/dsl/opal/tab_folder_expression.rb +0 -17
  113. data/lib/glimmer/dsl/opal/tab_item_expression.rb +0 -17
  114. data/lib/glimmer/dsl/opal/text_expression.rb +0 -22
  115. data/lib/glimmer/opal/display_proxy.rb +0 -23
  116. data/lib/glimmer/opal/div_proxy.rb +0 -29
  117. data/lib/glimmer/opal/document_proxy.rb +0 -187
  118. data/lib/glimmer/opal/element_proxy.rb +0 -304
  119. data/lib/glimmer/opal/grid_layout_proxy.rb +0 -54
  120. data/lib/glimmer/opal/iframe_proxy.rb +0 -23
  121. data/lib/glimmer/opal/input_proxy.rb +0 -45
  122. data/lib/glimmer/opal/label_proxy.rb +0 -25
  123. data/lib/glimmer/opal/layout_data_proxy.rb +0 -52
  124. data/lib/glimmer/opal/modal.rb +0 -94
  125. data/lib/glimmer/opal/tab_item.rb +0 -98
  126. data/lib/samples/elaborate/launch +0 -6
  127. data/lib/samples/hello/hello_combo.rb +0 -34
  128. data/lib/samples/hello/hello_tab.rb +0 -24
  129. data/lib/samples/hello/hello_world.rb +0 -8
  130. data/lib/samples/hello/launch +0 -10
  131. data/lib/samples/launch +0 -4
@@ -0,0 +1,38 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ # Adapter for org.eclipse.swt.widgets.Group
6
+ #
7
+ # Follows Adapter Pattern
8
+ class GroupProxy < CompositeProxy
9
+ attr_reader :text
10
+
11
+ def text=(value)
12
+ @text = value
13
+ if @text.nil?
14
+ legend_dom_element.add_class('hide')
15
+ else
16
+ legend_dom_element.remove_class('hide')
17
+ end
18
+ legend_dom_element.html(@text)
19
+ end
20
+
21
+ def element
22
+ 'fieldset'
23
+ end
24
+
25
+ def legend_dom_element
26
+ dom_element.find('legend')
27
+ end
28
+
29
+ def dom
30
+ @dom ||= html {
31
+ fieldset(id: id, class: name) {
32
+ legend(class: 'hide') { text }
33
+ }
34
+ }.to_s
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,54 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+ # require 'glimmer/swt/image_proxy'
3
+
4
+ module Glimmer
5
+ module SWT
6
+ class LabelProxy < WidgetProxy
7
+ attr_reader :text, :background_image, :image, :alignment
8
+
9
+ def initialize(parent, args)
10
+ super(parent, args)
11
+ self.alignment = [:left, :center, :right].detect {|align| args.detect { |arg| SWTProxy[align] == arg } }
12
+ end
13
+
14
+ def text=(value)
15
+ @text = value
16
+ dom_element.html(value)
17
+ end
18
+
19
+ def background_image=(*image_options)
20
+ # TODO consider if there is a difference between background_image and image in label and to have one reuse the other
21
+ # TODO finish implementation
22
+ # @background_image = Glimmer::SWT::ImageProxy.create(*image_options)
23
+ # dom_element.css('background-image', @background_image.image_data.dom_element.src)
24
+ end
25
+
26
+ def image=(*image_options)
27
+ # TODO finish implementation
28
+ # @image = Glimmer::SWT::ImageProxy.create(*image_options)
29
+ # dom_element.css('background-image', @image.image_data.dom_element.src)
30
+ end
31
+
32
+ def element
33
+ 'label'
34
+ end
35
+
36
+ def alignment=(value)
37
+ # TODO consider storing swt value in the future instead
38
+ @alignment = value
39
+ dom_element.css('text-align', @alignment.to_s)
40
+ end
41
+
42
+ def dom
43
+ label_text = @text
44
+ label_id = id
45
+ label_class = name
46
+ @dom ||= html {
47
+ label(id: label_id, class: label_class) {
48
+ label_text
49
+ }
50
+ }.to_s
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,105 @@
1
+ require 'glimmer/swt/property_owner'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ class LayoutDataProxy
6
+ include Glimmer::SWT::PropertyOwner
7
+ attr_reader :parent,
8
+ :args,
9
+ :horizontal_alignment,
10
+ :vertical_alignment,
11
+ :horizontal_span,
12
+ :vertical_span,
13
+ :horizontal_indent,
14
+ :vertical_indent,
15
+ :grab_excess_horizontal_space,
16
+ :grab_excess_vertical_space,
17
+ :width_hint,
18
+ :height_hint
19
+
20
+ def initialize(parent, args)
21
+ @parent = parent
22
+ @args = args
23
+ self.horizontal_alignment = @args[0] if @args[0]
24
+ self.vertical_alignment = @args[1] if @args[1]
25
+ self.grab_excess_horizontal_space = @args[2] if @args[2]
26
+ self.grab_excess_vertical_space = @args[3] if @args[3]
27
+ # TODO spread args correctly as per SWT LayoutData API
28
+ # TODO avoid using reapply
29
+ # reapply
30
+ end
31
+
32
+ def width_hint=(width_hint)
33
+ @width_hint = width_hint
34
+ @parent.dom_element.css('width', "#{@width_hint}px")
35
+ # reapply
36
+ end
37
+
38
+ def height_hint=(height_hint)
39
+ @height_hint = height_hint
40
+ @parent.dom_element.css('height', "#{@height_hint}px")
41
+ # reapply
42
+ end
43
+
44
+ def horizontal_alignment=(horizontal_alignment)
45
+ @horizontal_alignment = horizontal_alignment
46
+ return if @horizontal_alignment.nil?
47
+ if @horizontal_alignment == 'fill'
48
+ @parent.dom_element.css('width', '100%') if width_hint.nil?
49
+ else
50
+ @parent.dom_element.css('text-align', @horizontal_alignment)
51
+ end
52
+ # TODO
53
+ # reapply
54
+ end
55
+
56
+ def vertical_alignment=(vertical_alignment)
57
+ @vertical_alignment = vertical_alignment
58
+ # TODO
59
+ # reapply
60
+ end
61
+
62
+ def horizontal_span=(value)
63
+ @horizontal_span = value
64
+ @parent.dom_element.css('grid-column-start', "span #{@horizontal_span}")
65
+ # reapply
66
+ end
67
+
68
+ def vertical_span=(value)
69
+ @vertical_span = value
70
+ @parent.dom_element.css('grid-row-start', "span #{@vertical_span}")
71
+ # reapply
72
+ end
73
+
74
+ def horizontal_indent=(value)
75
+ @horizontal_indent = value
76
+ @parent.dom_element.css('padding-left', @horizontal_indent)
77
+ # reapply
78
+ end
79
+
80
+ def vertical_indent=(value)
81
+ @vertical_indent = value
82
+ @parent.dom_element.css('padding-top', @vertical_indent)
83
+ # reapply
84
+ end
85
+
86
+ def grab_excess_horizontal_space=(grab_excess_horizontal_space)
87
+ @grab_excess_horizontal_space = grab_excess_horizontal_space
88
+ @parent.dom_element.css('width', "100%") if @grab_excess_horizontal_space && width_hint.nil?
89
+ # reapply
90
+ end
91
+
92
+ def grab_excess_vertical_space=(grab_excess_vertical_space)
93
+ @grab_excess_vertical_space = grab_excess_vertical_space
94
+ @parent.dom_element.css('height', "100%") if @grab_excess_vertical_space && height_hint.nil?
95
+ # TODO
96
+ # reapply
97
+ end
98
+
99
+ def reapply
100
+ # @parent.css = <<~CSS
101
+ # CSS
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,63 @@
1
+ require 'glimmer/swt/property_owner'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ class LayoutProxy
6
+ include Glimmer::SWT::PropertyOwner
7
+
8
+ class << self
9
+ # Factory Method that translates a Glimmer DSL keyword into a WidgetProxy object
10
+ def for(keyword, parent, args)
11
+ the_layout_class = layout_class(keyword) || Glimmer::SWT::GridLayoutProxy
12
+ the_layout_class.new(parent, args)
13
+ end
14
+
15
+ def layout_class(keyword)
16
+ class_name_alternative = keyword.camelcase(:upper)
17
+ class_name_main = "#{class_name_alternative}Proxy"
18
+ a_layout_class = Glimmer::SWT.const_get(class_name_main.to_sym) rescue Glimmer::SWT.const_get(class_name_alternative.to_sym)
19
+ a_layout_class if a_layout_class.ancestors.include?(Glimmer::SWT::LayoutProxy)
20
+ rescue => e
21
+ puts "Layout #{keyword} was not found!"
22
+ nil
23
+ end
24
+
25
+ def layout_exists?(keyword)
26
+ !!layout_class(keyword)
27
+ end
28
+ end
29
+
30
+ attr_reader :parent, :args
31
+
32
+ def initialize(parent, args)
33
+ @parent = parent
34
+ @parent = parent.body_root if @parent.is_a?(Glimmer::UI::CustomWidget)
35
+ @parent.css_classes.each do |css_class|
36
+ @parent.remove_css_class(css_class) if css_class.include?('layout')
37
+ end
38
+ @args = args
39
+ @parent.add_css_class(css_class)
40
+ @parent.layout = self
41
+ self.margin_width = 15 if respond_to?(:margin_width=)
42
+ self.margin_height = 15 if respond_to?(:margin_height=)
43
+ end
44
+
45
+ def css_class
46
+ self.class.name.split('::').last.underscore.sub(/_proxy$/, '').gsub('_', '-')
47
+ end
48
+
49
+ def reapply
50
+ # subclasses can override this
51
+ end
52
+
53
+ # Decorates widget dom. Subclasses may override. Returns widget dom by default.
54
+ def dom(widget_dom)
55
+ widget_dom
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ require 'glimmer/swt/grid_layout_proxy'
62
+ require 'glimmer/swt/fill_layout_proxy'
63
+ require 'glimmer/swt/row_layout_proxy'
@@ -1,8 +1,8 @@
1
- require 'glimmer/opal/element_proxy'
1
+ require 'glimmer/swt/widget_proxy'
2
2
 
3
3
  module Glimmer
4
- module Opal
5
- class ListProxy < ElementProxy
4
+ module SWT
5
+ class ListProxy < WidgetProxy
6
6
  ITEM_EMPTY = '_____'
7
7
  attr_reader :items, :selection
8
8
 
@@ -13,7 +13,18 @@ module Glimmer
13
13
 
14
14
  def items=(items)
15
15
  @items = items.map {|item| item.strip == '' ? ITEM_EMPTY : item}
16
- redraw
16
+ list_selection = selection
17
+ items_dom = @items.to_a.each_with_index.map do |item, index|
18
+ li_class = ''
19
+ li_class += ' selected' if list_selection.include?(item)
20
+ li_class += ' empty-list-item' if item == ITEM_EMPTY
21
+ html {
22
+ li(class: li_class) {
23
+ item
24
+ }
25
+ }.to_s
26
+ end
27
+ dom_element.html(items_dom)
17
28
  end
18
29
 
19
30
  def index_of(item)
@@ -23,7 +34,11 @@ module Glimmer
23
34
  # used for multi-selection taking an array
24
35
  def selection=(selection)
25
36
  @selection = selection
26
- redraw
37
+ dom_element.find('li').remove_class('selected')
38
+ @selection.each do |item|
39
+ index = @items.index(item)
40
+ dom_element.find("li:nth-child(#{index + 1})").add_class('selected')
41
+ end
27
42
  end
28
43
 
29
44
  # used for single selection taking an index
@@ -43,37 +58,30 @@ module Glimmer
43
58
  'on_widget_selected' => {
44
59
  event: 'click',
45
60
  event_handler: -> (event_listener) {
46
- -> (event) {
47
- selected_item = event.target.text
48
- select(index_of(selected_item), event.meta?)
49
- event_listener.call(event)
61
+ -> (event) {
62
+ if event.target.prop('nodeName') == 'LI'
63
+ selected_item = event.target.text
64
+ select(index_of(selected_item), event.meta_key)
65
+ event_listener.call(event)
66
+ end
50
67
  }
51
68
  }
52
69
  }
53
70
  }
54
71
  end
55
72
 
56
- def name
73
+ def element
57
74
  'ul'
58
75
  end
59
76
 
60
77
  def dom
61
- list_items = @items
62
78
  list_id = id
63
79
  list_style = css
64
80
  list_selection = selection
65
- @dom ||= DOM {
66
- ul(id: list_id, style: list_style) {
67
- list_items.to_a.each_with_index do |item, index|
68
- li_class = ''
69
- li_class += ' selected' if list_selection.include?(item)
70
- li_class += ' empty-list-item' if item == ITEM_EMPTY
71
- li(class: li_class) {
72
- item
73
- }
74
- end
81
+ @dom ||= html {
82
+ ul(id: list_id, class: name, style: list_style) {
75
83
  }
76
- }
84
+ }.to_s
77
85
  end
78
86
  end
79
87
  end
@@ -0,0 +1,38 @@
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
+ module Glimmer
23
+ module SWT
24
+ class MakeShiftShellProxy < Glimmer::SWT::ShellProxy
25
+ def initialize(*args, &block)
26
+ # No Op
27
+ end
28
+
29
+ def add_child(child)
30
+ # No Op
31
+ end
32
+
33
+ def open
34
+ # No Op
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,143 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ class MessageBoxProxy < WidgetProxy
6
+ attr_reader :text, :message
7
+
8
+ def initialize(parent, args)
9
+ i = 0
10
+ @parent = parent
11
+ @args = args
12
+ @children = Set.new
13
+ @enabled = true
14
+ content do
15
+ on_widget_selected {
16
+ hide
17
+ }
18
+ end
19
+ end
20
+
21
+ def text=(txt)
22
+ @text = txt
23
+ dom_element.find('.modal-content .text').html(@text)
24
+ end
25
+
26
+ def message=(msg)
27
+ @message = msg
28
+ dom_element.find('.modal-content .message').html(@text)
29
+ end
30
+
31
+ def document
32
+ element = self
33
+ begin
34
+ element = element.parent
35
+ end while(element.parent)
36
+ element
37
+ end
38
+
39
+ def open
40
+ document.add_child(self)
41
+ end
42
+
43
+ def hide
44
+ dom_element.remove
45
+ end
46
+
47
+ def content(&block)
48
+ Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Opal::MessageBoxExpression.new, &block)
49
+ end
50
+
51
+ def name
52
+ 'div'
53
+ end
54
+
55
+ def selector
56
+ super + ' .close'
57
+ end
58
+
59
+ def listener_path
60
+ path + ' .close'
61
+ end
62
+
63
+ def observation_request_to_event_mapping
64
+ {
65
+ 'on_widget_selected' => {
66
+ event: 'click'
67
+ },
68
+ }
69
+ end
70
+
71
+ def style_dom_modal_css
72
+ <<~CSS
73
+ .modal {
74
+ position: fixed;
75
+ z-index: 1;
76
+ padding-top: 100px;
77
+ left: 0;
78
+ top: 0;
79
+ width: 100%;
80
+ height: 100%;
81
+ overflow: auto;
82
+ background-color: rgb(0,0,0);
83
+ background-color: rgba(0,0,0,0.4);
84
+ text-align: center;
85
+ }
86
+ .modal-content .text {
87
+ background: rgb(80, 116, 211);
88
+ color: white;
89
+ padding: 5px;
90
+ }
91
+ .modal-content .message {
92
+ padding: 20px;
93
+ }
94
+ .modal-content {
95
+ background-color: #fefefe;
96
+ padding-bottom: 15px;
97
+ border: 1px solid #888;
98
+ display: inline-block;
99
+ min-width: 200px;
100
+ }
101
+ CSS
102
+ # .close {
103
+ # color: #aaaaaa;
104
+ # float: right;
105
+ # font-weight: bold;
106
+ # margin: 5px;
107
+ # }
108
+ # .close:hover,
109
+ # .close:focus {
110
+ # color: #000;
111
+ # text-decoration: none;
112
+ # cursor: pointer;
113
+ # }
114
+ end
115
+
116
+ def dom
117
+ modal_id = id
118
+ modal_style = css
119
+ modal_text = text
120
+ modal_message = message
121
+ modal_class = ['modal', name].join(' ')
122
+ @dom ||= html {
123
+ div(id: modal_id, style: modal_style, class: modal_class) {
124
+ style(class: 'modal-style') {
125
+ style_dom_modal_css #.split("\n").map(&:strip).join(' ')
126
+ }
127
+ div(class: 'modal-content') {
128
+ header(class: 'text') {
129
+ modal_text
130
+ }
131
+ tag(_name: 'p', id: 'message', class: 'message') {
132
+ modal_message
133
+ }
134
+ input(type: 'button', class: 'close', autofocus: 'autofocus', value: 'OK')
135
+ }
136
+ }
137
+ }.to_s
138
+ end
139
+ end
140
+ end
141
+ end
142
+
143
+ require 'glimmer/dsl/opal/message_box_expression'