glimmer-dsl-opal 0.0.5 → 0.1.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 +41 -0
- data/README.md +1003 -58
- data/VERSION +1 -1
- data/lib/glimmer-dsl-opal.rb +26 -8
- data/lib/glimmer/data_binding/element_binding.rb +1 -1
- data/lib/glimmer/data_binding/ext/observable_model.rb +40 -0
- data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
- data/lib/glimmer/data_binding/table_items_binding.rb +70 -0
- data/lib/glimmer/dsl/opal/async_exec_expression.rb +17 -0
- data/lib/glimmer/dsl/opal/column_properties_expression.rb +22 -0
- data/lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/dsl.rb +10 -12
- data/lib/glimmer/dsl/opal/layout_data_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/{text_expression.rb → layout_expression.rb} +5 -5
- data/lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb +2 -3
- data/lib/glimmer/dsl/opal/message_box_expression.rb +20 -0
- data/lib/glimmer/dsl/opal/observe_expression.rb +32 -0
- data/lib/glimmer/dsl/opal/shell_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/{composite_expression.rb → table_column_expression.rb} +3 -3
- data/lib/glimmer/dsl/opal/{list_expression.rb → table_expression.rb} +3 -3
- data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +29 -0
- data/lib/glimmer/dsl/opal/widget_expression.rb +23 -0
- data/lib/glimmer/opal/display_proxy.rb +23 -0
- data/lib/glimmer/opal/element_proxy.rb +48 -13
- data/lib/glimmer/swt/browser_proxy.rb +27 -0
- data/lib/glimmer/swt/button_proxy.rb +40 -0
- data/lib/glimmer/{opal/select_proxy.rb → swt/combo_proxy.rb} +15 -11
- data/lib/glimmer/swt/composite_proxy.rb +31 -0
- data/lib/glimmer/{opal → swt}/event_listener_proxy.rb +1 -1
- data/lib/glimmer/{opal → swt}/grid_layout_proxy.rb +7 -18
- data/lib/glimmer/swt/label_proxy.rb +30 -0
- data/lib/glimmer/swt/layout_data_proxy.rb +52 -0
- data/lib/glimmer/swt/layout_proxy.rb +60 -0
- data/lib/glimmer/{opal → swt}/list_proxy.rb +18 -15
- data/lib/glimmer/swt/message_box_proxy.rb +146 -0
- data/lib/glimmer/{opal → swt}/point.rb +1 -1
- data/lib/glimmer/{opal → swt}/property_owner.rb +1 -1
- data/lib/glimmer/swt/shell_proxy.rb +235 -0
- data/lib/glimmer/swt/tab_folder_proxy.rb +52 -0
- data/lib/glimmer/swt/tab_item_proxy.rb +101 -0
- data/lib/glimmer/swt/table_column_proxy.rb +56 -0
- data/lib/glimmer/swt/table_item_proxy.rb +147 -0
- data/lib/glimmer/swt/table_proxy.rb +177 -0
- data/lib/glimmer/swt/text_proxy.rb +46 -0
- data/lib/glimmer/swt/widget_proxy.rb +389 -0
- data/lib/jquery.js +2 -0
- data/lib/samples/elaborate/contact_manager.rb +2 -3
- data/lib/samples/elaborate/login.rb +0 -1
- data/lib/samples/elaborate/tic_tac_toe.rb +5 -5
- data/lib/samples/hello/hello_computed.rb +19 -19
- data/lib/samples/hello/hello_tab.rb +2 -2
- metadata +92 -59
- data/lib/glimmer/config.rb +0 -22
- data/lib/glimmer/dsl/engine.rb +0 -193
- data/lib/glimmer/dsl/expression.rb +0 -42
- data/lib/glimmer/dsl/expression_handler.rb +0 -48
- data/lib/glimmer/dsl/opal/browser_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/button_expression.rb +0 -18
- data/lib/glimmer/dsl/opal/combo_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/grid_layout_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/label_expression.rb +0 -17
- data/lib/glimmer/dsl/parent_expression.rb +0 -12
- data/lib/glimmer/dsl/static_expression.rb +0 -36
- data/lib/glimmer/dsl/top_level_expression.rb +0 -7
- data/lib/glimmer/error.rb +0 -6
- data/lib/glimmer/invalid_keyword_error.rb +0 -6
- data/lib/glimmer/opal/div_proxy.rb +0 -20
- data/lib/glimmer/opal/document_proxy.rb +0 -90
- data/lib/glimmer/opal/iframe_proxy.rb +0 -23
- data/lib/glimmer/opal/input_proxy.rb +0 -41
- data/lib/glimmer/opal/label_proxy.rb +0 -25
- data/lib/glimmer/opal/layout_data_proxy.rb +0 -31
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'glimmer/error'
|
2
|
-
|
3
|
-
module Glimmer
|
4
|
-
module DSL
|
5
|
-
# Represents a Glimmer DSL expression (e.g. label(:center) { ... })
|
6
|
-
#
|
7
|
-
# An expression object can interpret a keyword, args, and a block into a UI object
|
8
|
-
#
|
9
|
-
# Expressions subclasses follow the convention of using `and` and `or`
|
10
|
-
# english versino of Ruby's boolean operations. This allows easy DSL-like
|
11
|
-
# readability of the rules, and easy tagging with pd when troubleshooting.
|
12
|
-
class Expression
|
13
|
-
class << self
|
14
|
-
def dsl
|
15
|
-
@dsl ||= name.split(/::/)[-2].downcase.to_sym
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Checks if it can interpret parameters (subclass must override)
|
20
|
-
def can_interpret?(parent, keyword, *args, &block)
|
21
|
-
raise Error, "#can_interpret? must be implemented by an Expression subclass"
|
22
|
-
end
|
23
|
-
|
24
|
-
# Interprets parameters (subclass must override)
|
25
|
-
def interpret(parent, keyword, *args, &block)
|
26
|
-
raise Error, "#interpret must be implemented by an Expression subclass"
|
27
|
-
end
|
28
|
-
|
29
|
-
# Adds block content to specified parent UI object (Optional)
|
30
|
-
#
|
31
|
-
# Only expressions that receive a content block should implement
|
32
|
-
def add_content(parent, &block)
|
33
|
-
# No Op by default
|
34
|
-
end
|
35
|
-
|
36
|
-
# Checks if object is a Symbol or a String
|
37
|
-
def textual?(object)
|
38
|
-
object.is_a?(Symbol) or object.is_a?(String)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'glimmer/invalid_keyword_error'
|
2
|
-
|
3
|
-
module Glimmer
|
4
|
-
module DSL
|
5
|
-
# Expression handler for a Glimmer DSL specific expression
|
6
|
-
#
|
7
|
-
# Follows the Chain of Responsibility Design Pattern
|
8
|
-
#
|
9
|
-
# Handlers are configured in Glimmer::DSL in the right order
|
10
|
-
# to attempt handling Glimmer DSL interpretation calls
|
11
|
-
#
|
12
|
-
# Each handler knows the next handler in the chain of responsibility.
|
13
|
-
#
|
14
|
-
# If it handles successfully, it returns. Otherwise, it forwards to the next
|
15
|
-
# handler in the chain of responsibility
|
16
|
-
class ExpressionHandler
|
17
|
-
def initialize(expression)
|
18
|
-
@expression = expression
|
19
|
-
end
|
20
|
-
|
21
|
-
# Handles interpretation of Glimmer DSL expression if expression supports it
|
22
|
-
# If it succeeds, it returns the correct Glimmer DSL expression object
|
23
|
-
# Otherwise, it forwards to the next handler configured via `#next=` method
|
24
|
-
# If there is no handler next, then it raises an error
|
25
|
-
def handle(parent, keyword, *args, &block)
|
26
|
-
Glimmer::Config.logger&.debug "Attempting to handle #{keyword} with #{@expression.class.name.split(":").last}"
|
27
|
-
if @expression.can_interpret?(parent, keyword, *args, &block)
|
28
|
-
Glimmer::Config.logger&.debug "#{@expression.class.name} will handle expression keyword #{keyword}"
|
29
|
-
return @expression
|
30
|
-
elsif @next_expression_handler
|
31
|
-
return @next_expression_handler.handle(parent, keyword, *args, &block)
|
32
|
-
else
|
33
|
-
# TODO see if we need a better response here (e.g. dev mode error raising vs production mode silent failure)
|
34
|
-
message = "Glimmer keyword #{keyword} with args #{args} cannot be handled"
|
35
|
-
message += " inside parent #{parent}" if parent
|
36
|
-
message += "! Check the validity of the code."
|
37
|
-
# Glimmer::Config.logger&.error message
|
38
|
-
raise InvalidKeywordError, message
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# Sets the next handler in the expression handler chain of responsibility
|
43
|
-
def next=(next_expression_handler)
|
44
|
-
@next_expression_handler = next_expression_handler
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'glimmer/dsl/static_expression'
|
2
|
-
require 'glimmer/dsl/parent_expression'
|
3
|
-
require 'glimmer/opal/iframe_proxy'
|
4
|
-
|
5
|
-
module Glimmer
|
6
|
-
module DSL
|
7
|
-
module Opal
|
8
|
-
class BrowserExpression < StaticExpression
|
9
|
-
include ParentExpression
|
10
|
-
|
11
|
-
def interpret(parent, keyword, *args, &block)
|
12
|
-
Glimmer::Opal::IframeProxy.new(parent, args)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'glimmer/dsl/static_expression'
|
2
|
-
require 'glimmer/dsl/parent_expression'
|
3
|
-
require 'glimmer/opal/input_proxy'
|
4
|
-
|
5
|
-
module Glimmer
|
6
|
-
module DSL
|
7
|
-
module Opal
|
8
|
-
class ButtonExpression < StaticExpression
|
9
|
-
include ParentExpression
|
10
|
-
|
11
|
-
def interpret(parent, keyword, *args, &block)
|
12
|
-
args << {type: 'button'}
|
13
|
-
Glimmer::Opal::InputProxy.new(parent, args)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'glimmer/dsl/static_expression'
|
2
|
-
require 'glimmer/dsl/parent_expression'
|
3
|
-
require 'glimmer/opal/select_proxy'
|
4
|
-
|
5
|
-
module Glimmer
|
6
|
-
module DSL
|
7
|
-
module Opal
|
8
|
-
class ComboExpression < StaticExpression
|
9
|
-
include ParentExpression
|
10
|
-
|
11
|
-
def interpret(parent, keyword, *args, &block)
|
12
|
-
Glimmer::Opal::SelectProxy.new(parent, args)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'glimmer/dsl/static_expression'
|
2
|
-
require 'glimmer/dsl/parent_expression'
|
3
|
-
require 'glimmer/opal/grid_layout_proxy'
|
4
|
-
|
5
|
-
module Glimmer
|
6
|
-
module DSL
|
7
|
-
module Opal
|
8
|
-
class GridLayoutExpression < StaticExpression
|
9
|
-
include ParentExpression
|
10
|
-
|
11
|
-
def interpret(parent, keyword, *args, &block)
|
12
|
-
Glimmer::Opal::GridLayoutProxy.new(parent, args)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'glimmer/dsl/static_expression'
|
2
|
-
require 'glimmer/dsl/parent_expression'
|
3
|
-
require 'glimmer/opal/label_proxy'
|
4
|
-
|
5
|
-
module Glimmer
|
6
|
-
module DSL
|
7
|
-
module Opal
|
8
|
-
class LabelExpression < StaticExpression
|
9
|
-
include ParentExpression
|
10
|
-
|
11
|
-
def interpret(parent, keyword, *args, &block)
|
12
|
-
Glimmer::Opal::LabelProxy.new(parent, args)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'glimmer/error'
|
2
|
-
require 'glimmer/dsl/engine'
|
3
|
-
require 'glimmer/dsl/expression'
|
4
|
-
|
5
|
-
module Glimmer
|
6
|
-
module DSL
|
7
|
-
# Represents a StaticExpression for expressions where
|
8
|
-
# the keyword does not vary dynamically. These static keywords are then
|
9
|
-
# predefined as methods in Glimmer instead of needing method_missing
|
10
|
-
#
|
11
|
-
# StaticExpression subclasses may optionally implement `#can_interpret?`
|
12
|
-
# (not needed if it only checks for keyword)
|
13
|
-
#
|
14
|
-
# StaticExpression subclasses must define `#interpret`.
|
15
|
-
#
|
16
|
-
# The direct parent namespace of a StaticExpression subclass must match the DSL name (case-insensitive)
|
17
|
-
# (e.g. Glimmer::DSL::SWT::WidgetExpression has a DSL of :swt)
|
18
|
-
class StaticExpression < Expression
|
19
|
-
class << self
|
20
|
-
def inherited(base)
|
21
|
-
Glimmer::DSL::Engine.add_static_expression(base.new)
|
22
|
-
super
|
23
|
-
end
|
24
|
-
|
25
|
-
def keyword
|
26
|
-
@keyword ||= name.split(/::/).last.sub(/Expression$/, '').underscore
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Subclasses may optionally implement
|
31
|
-
def can_interpret?(parent, keyword, *args, &block)
|
32
|
-
true
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/glimmer/error.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'glimmer/opal/element_proxy'
|
2
|
-
|
3
|
-
module Glimmer
|
4
|
-
module Opal
|
5
|
-
class DivProxy < ElementProxy
|
6
|
-
def initialize(parent, args)
|
7
|
-
super(parent, args)
|
8
|
-
GridLayoutProxy.new(self, [])
|
9
|
-
end
|
10
|
-
|
11
|
-
def dom
|
12
|
-
div_id = id
|
13
|
-
div_style = style
|
14
|
-
@dom ||= DOM {
|
15
|
-
div(id: div_id, class: 'grid-layout', style: div_style)
|
16
|
-
}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'glimmer/opal/element_proxy'
|
2
|
-
require 'glimmer/opal/point'
|
3
|
-
|
4
|
-
module Glimmer
|
5
|
-
module Opal
|
6
|
-
class DocumentProxy < ElementProxy
|
7
|
-
# TODO consider renaming to ShellProxy to match SWT API
|
8
|
-
attr_reader :minimum_size
|
9
|
-
|
10
|
-
def initialize(args)
|
11
|
-
@args = args
|
12
|
-
@children = []
|
13
|
-
$document.ready do
|
14
|
-
$document.head.replace(head_dom)
|
15
|
-
$document.body.replace(dom)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def text
|
20
|
-
$document.title
|
21
|
-
end
|
22
|
-
|
23
|
-
def text=(value)
|
24
|
-
$document.ready do
|
25
|
-
$document.title = value
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def minimum_size=(width_or_minimum_size, height = nil)
|
30
|
-
@minimum_size = height.nil? ? width_or_minimum_size : Point.new(width_or_minimum_size, height)
|
31
|
-
redraw
|
32
|
-
end
|
33
|
-
|
34
|
-
def head_dom
|
35
|
-
# TODO make grid-layout support grab excess space false
|
36
|
-
@head_dom ||= DOM {
|
37
|
-
head {
|
38
|
-
<<~CSS
|
39
|
-
<style>
|
40
|
-
html {
|
41
|
-
width: 100%;
|
42
|
-
height: 100%;
|
43
|
-
}
|
44
|
-
body {
|
45
|
-
width: 100%;
|
46
|
-
height: 100%;
|
47
|
-
margin: 0;
|
48
|
-
}
|
49
|
-
body > iframe {
|
50
|
-
width: 100%;
|
51
|
-
height: 100%;
|
52
|
-
}
|
53
|
-
ul {
|
54
|
-
list-style: none;
|
55
|
-
padding: 0;
|
56
|
-
}
|
57
|
-
li {
|
58
|
-
cursor: default;
|
59
|
-
padding-left: 10px;
|
60
|
-
padding-right: 10px;
|
61
|
-
}
|
62
|
-
li.selected-list-item {
|
63
|
-
background: rgb(80, 116, 211);
|
64
|
-
color: white;
|
65
|
-
}
|
66
|
-
li.empty-list-item {
|
67
|
-
color: transparent;
|
68
|
-
}
|
69
|
-
</style>
|
70
|
-
CSS
|
71
|
-
}
|
72
|
-
}
|
73
|
-
end
|
74
|
-
|
75
|
-
def dom
|
76
|
-
i = 0
|
77
|
-
body_style = ''
|
78
|
-
body_style += "min-width: #{@minimum_size.x}px; min-height: #{@minimum_size.y}px;" if @minimum_size
|
79
|
-
@dom ||= DOM {
|
80
|
-
body(style: body_style) {
|
81
|
-
}
|
82
|
-
}
|
83
|
-
end
|
84
|
-
|
85
|
-
def open
|
86
|
-
# No Op (just a placeholder since it is not needed on the web)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'glimmer/opal/element_proxy'
|
2
|
-
|
3
|
-
module Glimmer
|
4
|
-
module Opal
|
5
|
-
class IframeProxy < ElementProxy
|
6
|
-
attr_reader :url
|
7
|
-
|
8
|
-
def url=(value)
|
9
|
-
@url = value
|
10
|
-
redraw
|
11
|
-
end
|
12
|
-
|
13
|
-
def dom
|
14
|
-
iframe_id = id
|
15
|
-
iframe_url = url
|
16
|
-
@dom ||= DOM {
|
17
|
-
iframe(src: iframe_url, frameBorder: 0) {
|
18
|
-
}
|
19
|
-
}
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'glimmer/opal/element_proxy'
|
2
|
-
|
3
|
-
module Glimmer
|
4
|
-
module Opal
|
5
|
-
class InputProxy < ElementProxy
|
6
|
-
attr_reader :text
|
7
|
-
|
8
|
-
def text=(value)
|
9
|
-
@text = value
|
10
|
-
redraw
|
11
|
-
end
|
12
|
-
|
13
|
-
def observation_request_to_event_mapping
|
14
|
-
{
|
15
|
-
'on_widget_selected' => {
|
16
|
-
event: 'click'
|
17
|
-
},
|
18
|
-
'on_modify_text' => {
|
19
|
-
event: 'keyup',
|
20
|
-
event_handler: -> (event_listener) {
|
21
|
-
-> (event) {
|
22
|
-
@text = event.target.value
|
23
|
-
event_listener.call(event)
|
24
|
-
}
|
25
|
-
}
|
26
|
-
}
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
def dom
|
31
|
-
input_text = @text
|
32
|
-
input_id = id
|
33
|
-
input_style = style
|
34
|
-
input_args = @args.last
|
35
|
-
@dom ||= DOM {
|
36
|
-
input input_args.merge(id: input_id, style: input_style, value: input_text)
|
37
|
-
}
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'glimmer/opal/element_proxy'
|
2
|
-
|
3
|
-
module Glimmer
|
4
|
-
module Opal
|
5
|
-
class LabelProxy < ElementProxy
|
6
|
-
attr_reader :text
|
7
|
-
|
8
|
-
def text=(value)
|
9
|
-
@text = value
|
10
|
-
redraw
|
11
|
-
end
|
12
|
-
|
13
|
-
def dom
|
14
|
-
label_text = @text
|
15
|
-
label_id = id
|
16
|
-
label_style = style
|
17
|
-
@dom ||= DOM {
|
18
|
-
label(id: label_id, style: label_style) {
|
19
|
-
label_text
|
20
|
-
}
|
21
|
-
}
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|