glimmer-dsl-opal 0.0.9 → 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 +6 -0
- data/README.md +57 -28
- data/VERSION +1 -1
- data/lib/glimmer-dsl-opal.rb +26 -11
- data/lib/glimmer/data_binding/element_binding.rb +1 -1
- data/lib/glimmer/data_binding/ext/observable_model.rb +4 -4
- data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
- data/lib/glimmer/data_binding/table_items_binding.rb +3 -3
- data/lib/glimmer/dsl/opal/column_properties_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/dsl.rb +4 -16
- 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 +2 -2
- data/lib/glimmer/dsl/opal/shell_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/table_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +2 -2
- data/lib/glimmer/dsl/opal/widget_expression.rb +23 -0
- data/lib/glimmer/opal/display_proxy.rb +3 -3
- data/lib/glimmer/opal/element_proxy.rb +11 -3
- 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} +14 -10
- data/lib/glimmer/{opal/div_proxy.rb → swt/composite_proxy.rb} +8 -6
- data/lib/glimmer/{opal → swt}/event_listener_proxy.rb +1 -1
- data/lib/glimmer/{opal → swt}/grid_layout_proxy.rb +5 -18
- data/lib/glimmer/swt/label_proxy.rb +30 -0
- data/lib/glimmer/{opal → swt}/layout_data_proxy.rb +3 -3
- data/lib/glimmer/swt/layout_proxy.rb +60 -0
- data/lib/glimmer/{opal → swt}/list_proxy.rb +16 -13
- data/lib/glimmer/{opal/modal.rb → swt/message_box_proxy.rb} +61 -9
- 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/{opal/tab_folder.rb → swt/tab_folder_proxy.rb} +13 -14
- data/lib/glimmer/{opal/tab_item.rb → swt/tab_item_proxy.rb} +37 -34
- data/lib/glimmer/{opal/table_column.rb → swt/table_column_proxy.rb} +13 -7
- data/lib/glimmer/{opal/table_item.rb → swt/table_item_proxy.rb} +59 -48
- 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 +1 -1
- data/lib/samples/hello/hello_computed.rb +19 -19
- metadata +79 -55
- 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/composite_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/opal/list_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/tab_folder_expression.rb +0 -17
- data/lib/glimmer/dsl/opal/tab_item_expression.rb +0 -17
- data/lib/glimmer/opal/document_proxy.rb +0 -187
- data/lib/glimmer/opal/iframe_proxy.rb +0 -23
- data/lib/glimmer/opal/input_proxy.rb +0 -45
- data/lib/glimmer/opal/label_proxy.rb +0 -25
- data/lib/glimmer/opal/table_proxy.rb +0 -149
@@ -1,32 +1,32 @@
|
|
1
|
-
require 'glimmer/
|
1
|
+
require 'glimmer/swt/composite_proxy'
|
2
2
|
|
3
3
|
module Glimmer
|
4
|
-
module
|
5
|
-
class
|
4
|
+
module SWT
|
5
|
+
class TabItemProxy < CompositeProxy
|
6
6
|
include Glimmer
|
7
7
|
attr_reader :text, :content_visible
|
8
8
|
|
9
9
|
def initialize(parent, args)
|
10
10
|
super(parent, args)
|
11
11
|
css_classes << 'tab-item'
|
12
|
-
content
|
12
|
+
content {
|
13
13
|
on_widget_selected {
|
14
14
|
@parent.hide_all_tab_content
|
15
15
|
show
|
16
16
|
}
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def content(&block)
|
21
|
-
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::Opal::TabItemExpression.new, &block)
|
17
|
+
}
|
22
18
|
end
|
23
19
|
|
24
20
|
def show
|
21
|
+
# TODO refactor/rewrite via simply class application in jquery
|
22
|
+
# Document.find(path).remove_class('hide')
|
25
23
|
@content_visible = true
|
26
|
-
redraw
|
24
|
+
redraw
|
27
25
|
end
|
28
26
|
|
29
27
|
def hide
|
28
|
+
# TODO refactor/rewrite via simply class application in jquery
|
29
|
+
# Document.find(path).add_class('hide')
|
30
30
|
@content_visible = false
|
31
31
|
redraw
|
32
32
|
end
|
@@ -36,10 +36,6 @@ module Glimmer
|
|
36
36
|
redraw
|
37
37
|
end
|
38
38
|
|
39
|
-
def name
|
40
|
-
'button'
|
41
|
-
end
|
42
|
-
|
43
39
|
def selector
|
44
40
|
super + '-tab'
|
45
41
|
end
|
@@ -50,49 +46,56 @@ module Glimmer
|
|
50
46
|
event: 'click'
|
51
47
|
},
|
52
48
|
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def listener_path
|
52
|
+
tab_path
|
53
53
|
end
|
54
54
|
|
55
55
|
def redraw
|
56
56
|
if @tab_dom
|
57
57
|
old_tab_dom = @tab_dom
|
58
58
|
@tab_dom = nil
|
59
|
-
|
59
|
+
Document.find(tab_path).replace_with(tab_dom)
|
60
60
|
else
|
61
|
-
tab_dom
|
61
|
+
Document.find(parent.tabs_path).append(tab_dom)
|
62
62
|
end
|
63
|
-
super
|
64
|
-
end
|
63
|
+
super()
|
64
|
+
end
|
65
|
+
|
66
|
+
def tab_path
|
67
|
+
"#{parent.tabs_path} > ##{tab_id}"
|
68
|
+
end
|
65
69
|
|
70
|
+
def tab_id
|
71
|
+
id + '-tab'
|
72
|
+
end
|
73
|
+
|
66
74
|
def tab_dom
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
button(id: tab_id, class: "tab #{tab_active}") {
|
72
|
-
tab_text
|
75
|
+
tab_selected = @content_visible ? 'selected' : ''
|
76
|
+
@tab_dom ||= html {
|
77
|
+
button(id: tab_id, class: "tab #{tab_selected}") {
|
78
|
+
@text
|
73
79
|
}
|
74
|
-
}
|
80
|
+
}.to_s
|
75
81
|
end
|
76
82
|
|
77
83
|
def dom
|
78
84
|
tab_item_id = id
|
79
85
|
tab_item_id_style = css
|
80
86
|
tab_item_css_classes = css_classes
|
81
|
-
|
87
|
+
css_classes << name
|
88
|
+
if @content_visible
|
82
89
|
tab_item_css_classes.delete('hide')
|
83
90
|
else
|
84
91
|
tab_item_css_classes << 'hide'
|
85
92
|
end
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
90
|
-
@dom ||= DOM {
|
91
|
-
div(id: tab_item_id, style: tab_item_id_style, class: tab_item_css_classes.to_a.join(' ')) {
|
93
|
+
tab_item_class_string = tab_item_css_classes.to_a.join(' ')
|
94
|
+
@dom ||= html {
|
95
|
+
div(id: tab_item_id, style: tab_item_id_style, class: tab_item_class_string) {
|
92
96
|
}
|
93
|
-
}
|
97
|
+
}.to_s
|
94
98
|
end
|
95
99
|
end
|
96
100
|
end
|
97
101
|
end
|
98
|
-
require 'glimmer/dsl/opal/tab_item_expression'
|
@@ -1,9 +1,10 @@
|
|
1
|
-
require 'glimmer/
|
1
|
+
require 'glimmer/swt/widget_proxy'
|
2
2
|
|
3
3
|
module Glimmer
|
4
|
-
module
|
5
|
-
class
|
4
|
+
module SWT
|
5
|
+
class TableColumnProxy < WidgetProxy
|
6
6
|
include Glimmer
|
7
|
+
|
7
8
|
attr_reader :text, :width
|
8
9
|
|
9
10
|
def text=(value)
|
@@ -16,13 +17,17 @@ module Glimmer
|
|
16
17
|
redraw
|
17
18
|
end
|
18
19
|
|
20
|
+
def parent_path
|
21
|
+
parent.columns_path
|
22
|
+
end
|
23
|
+
|
19
24
|
def css
|
20
25
|
<<~CSS
|
21
|
-
width: #{width};
|
26
|
+
width: #{width}px;
|
22
27
|
CSS
|
23
28
|
end
|
24
29
|
|
25
|
-
def
|
30
|
+
def element
|
26
31
|
'th'
|
27
32
|
end
|
28
33
|
|
@@ -39,11 +44,12 @@ module Glimmer
|
|
39
44
|
table_column_id = id
|
40
45
|
table_column_id_style = css
|
41
46
|
table_column_css_classes = css_classes
|
42
|
-
|
47
|
+
table_column_css_classes << name
|
48
|
+
@dom ||= html {
|
43
49
|
th(id: table_column_id, style: table_column_id_style, class: table_column_css_classes.to_a.join(' ')) {
|
44
50
|
table_column_text
|
45
51
|
}
|
46
|
-
}
|
52
|
+
}.to_s
|
47
53
|
end
|
48
54
|
end
|
49
55
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
require 'glimmer/swt/widget_proxy'
|
2
2
|
|
3
3
|
module Glimmer
|
4
|
-
module
|
5
|
-
class
|
4
|
+
module SWT
|
5
|
+
class TableItemProxy < WidgetProxy
|
6
6
|
attr_reader :data
|
7
7
|
|
8
8
|
def initialize(parent, args)
|
@@ -45,10 +45,58 @@ module Glimmer
|
|
45
45
|
@data_hash ||= {}
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
48
|
+
def parent_path
|
49
|
+
parent.items_path
|
50
|
+
end
|
51
|
+
|
52
|
+
def element
|
49
53
|
'tr'
|
50
54
|
end
|
51
55
|
|
56
|
+
def redraw
|
57
|
+
super() #TODO re-enalbe and remove below lines
|
58
|
+
|
59
|
+
# TODO perhaps turn the following lambdas into methods
|
60
|
+
table_item_edit_handler = lambda do |event, cancel = false|
|
61
|
+
Async::Task.new do
|
62
|
+
text_value = event.target.value
|
63
|
+
edit_property = parent.column_properties[@edit_column_index]
|
64
|
+
edit_model = get_data
|
65
|
+
if !cancel && edit_model.send(edit_property) != text_value
|
66
|
+
edit_model.send("#{edit_property}=", text_value)
|
67
|
+
set_text(@edit_column_index, text_value)
|
68
|
+
end
|
69
|
+
@edit_column_index = nil
|
70
|
+
redraw
|
71
|
+
end
|
72
|
+
end
|
73
|
+
table_item_edit_cancel_handler = lambda do |event|
|
74
|
+
Async::Task.new do
|
75
|
+
table_item_edit_handler.call(event, true)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
table_item_edit_key_handler = lambda do |event|
|
79
|
+
Async::Task.new do
|
80
|
+
if event.key_code == 13
|
81
|
+
table_item_edit_handler.call(event)
|
82
|
+
elsif event.key_code == 27
|
83
|
+
table_item_edit_cancel_handler.call(event)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
if @edit_column_index
|
89
|
+
table_item_input = dom_element.find("td:nth-child(#{@edit_column_index + 1}) input")
|
90
|
+
if !table_item_input.empty?
|
91
|
+
Async::Task.new do
|
92
|
+
table_item_input.focus
|
93
|
+
table_item_input.on('keyup', &table_item_edit_key_handler)
|
94
|
+
table_item_input.on('focusout', &table_item_edit_cancel_handler)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
52
100
|
def edit(column_index)
|
53
101
|
return if @edit_column_index == column_index.to_i
|
54
102
|
parent.select(parent.index_of(self), false)
|
@@ -63,13 +111,14 @@ module Glimmer
|
|
63
111
|
end
|
64
112
|
|
65
113
|
def max_column_width(column_index)
|
66
|
-
|
114
|
+
parent_dom_element.find("tr td:nth-child(#{column_index + 1})").first.width
|
67
115
|
end
|
68
116
|
|
69
117
|
def dom
|
70
118
|
table_item_id = id
|
71
119
|
table_item_id_style = css
|
72
120
|
table_item_css_classes = css_classes
|
121
|
+
table_item_css_classes << name
|
73
122
|
table_item_selection = parent.selection.include?(self)
|
74
123
|
if table_item_selection
|
75
124
|
table_item_css_classes << 'selected'
|
@@ -77,40 +126,13 @@ module Glimmer
|
|
77
126
|
table_item_css_classes.delete('selected')
|
78
127
|
end
|
79
128
|
table_item_text_array = text_array
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
Async::Task.new do
|
84
|
-
text_value = event.target.value
|
85
|
-
edit_property = parent.column_properties[table_item_edit_column_index]
|
86
|
-
edit_model = get_data
|
87
|
-
if !cancel && edit_model.send(edit_property) != text_value
|
88
|
-
edit_model.send("#{edit_property}=", text_value)
|
89
|
-
set_text(table_item_edit_column_index, text_value)
|
90
|
-
end
|
91
|
-
@edit_column_index = nil
|
92
|
-
redraw
|
93
|
-
end
|
94
|
-
end
|
95
|
-
table_item_edit_cancel_handler = lambda do |event|
|
96
|
-
Async::Task.new do
|
97
|
-
table_item_edit_handler.call(event, true)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
table_item_edit_key_handler = lambda do |event|
|
101
|
-
Async::Task.new do
|
102
|
-
if event.code == 13
|
103
|
-
table_item_edit_handler.call(event)
|
104
|
-
elsif event.code == 27
|
105
|
-
table_item_edit_cancel_handler.call(event)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
@dom ||= DOM {
|
129
|
+
table_item_max_width = max_column_width(@edit_column_index) if @edit_column_index
|
130
|
+
|
131
|
+
@dom ||= html {
|
110
132
|
tr(id: table_item_id, style: table_item_id_style, class: table_item_css_classes.to_a.join(' ')) {
|
111
133
|
table_item_text_array.each_with_index do |table_item_text, column_index|
|
112
134
|
td('data-column-index' => column_index) {
|
113
|
-
if
|
135
|
+
if @edit_column_index == column_index
|
114
136
|
input(type: 'text', value: table_item_text, style: "max-width: #{table_item_max_width - 11}px;")
|
115
137
|
else
|
116
138
|
table_item_text
|
@@ -118,18 +140,7 @@ module Glimmer
|
|
118
140
|
}
|
119
141
|
end
|
120
142
|
}
|
121
|
-
}.
|
122
|
-
if table_item_edit_column_index
|
123
|
-
table_item_input = the_dom.css("td:nth-child(#{table_item_edit_column_index + 1}) input").first
|
124
|
-
if table_item_input
|
125
|
-
Async::Task.new do
|
126
|
-
table_item_input.focus
|
127
|
-
table_item_input.on('keyup', &table_item_edit_key_handler)
|
128
|
-
table_item_input.on('focusout', &table_item_edit_cancel_handler)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
143
|
+
}.to_s
|
133
144
|
end
|
134
145
|
end
|
135
146
|
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'glimmer/swt/widget_proxy'
|
2
|
+
require 'glimmer/swt/table_column_proxy'
|
3
|
+
|
4
|
+
module Glimmer
|
5
|
+
module SWT
|
6
|
+
class TableProxy < WidgetProxy
|
7
|
+
attr_reader :columns, :selection
|
8
|
+
attr_accessor :column_properties
|
9
|
+
alias items children
|
10
|
+
|
11
|
+
def initialize(parent, args)
|
12
|
+
super(parent, args)
|
13
|
+
@columns = []
|
14
|
+
@children = []
|
15
|
+
@selection = []
|
16
|
+
end
|
17
|
+
|
18
|
+
# Only table_columns may be added as children
|
19
|
+
def add_child(child)
|
20
|
+
if child.is_a?(TableColumnProxy)
|
21
|
+
@columns << child
|
22
|
+
else
|
23
|
+
@children << child
|
24
|
+
end
|
25
|
+
child.redraw
|
26
|
+
end
|
27
|
+
|
28
|
+
def remove_all
|
29
|
+
items.clear
|
30
|
+
redraw
|
31
|
+
end
|
32
|
+
|
33
|
+
def selection=(new_selection)
|
34
|
+
changed = (@selection + new_selection) - (@selection & new_selection)
|
35
|
+
@selection = new_selection
|
36
|
+
changed.each(&:redraw)
|
37
|
+
end
|
38
|
+
|
39
|
+
def items=(new_items)
|
40
|
+
@children = new_items
|
41
|
+
redraw
|
42
|
+
end
|
43
|
+
|
44
|
+
def search(&condition)
|
45
|
+
items.select {|item| condition.nil? || condition.call(item)}
|
46
|
+
end
|
47
|
+
|
48
|
+
def index_of(item)
|
49
|
+
items.index(item)
|
50
|
+
end
|
51
|
+
|
52
|
+
def select(index, meta = false)
|
53
|
+
new_selection = @selection.clone
|
54
|
+
selected_item = items[index]
|
55
|
+
if @selection.include?(selected_item)
|
56
|
+
new_selection.delete(selected_item) if meta
|
57
|
+
else
|
58
|
+
new_selection = [] if !meta || (!has_style?(:multi) && @selection.to_a.size >= 1)
|
59
|
+
new_selection << selected_item
|
60
|
+
end
|
61
|
+
self.selection = new_selection
|
62
|
+
end
|
63
|
+
|
64
|
+
def edit_table_item(table_item, column_index)
|
65
|
+
table_item.edit(column_index)
|
66
|
+
end
|
67
|
+
|
68
|
+
def selector
|
69
|
+
super + ' tbody'
|
70
|
+
end
|
71
|
+
|
72
|
+
def observation_request_to_event_mapping
|
73
|
+
mouse_handler = -> (event_listener) {
|
74
|
+
-> (event) {
|
75
|
+
event.singleton_class.send(:define_method, :table_item=) do |item|
|
76
|
+
@table_item = item
|
77
|
+
end
|
78
|
+
event.singleton_class.send(:define_method, :table_item) do
|
79
|
+
@table_item
|
80
|
+
end
|
81
|
+
table_row = event.target.parents('tr').first
|
82
|
+
table_data = event.target.parents('td').first
|
83
|
+
event.table_item = items.detect {|item| item.id == table_row.attr('id')}
|
84
|
+
event.singleton_class.send(:define_method, :column_index) do
|
85
|
+
(table_data || event.target).attr('data-column-index')
|
86
|
+
end
|
87
|
+
event_listener.call(event)
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
{
|
92
|
+
'on_mouse_down' => {
|
93
|
+
event: 'mousedown',
|
94
|
+
event_handler: mouse_handler,
|
95
|
+
},
|
96
|
+
'on_mouse_up' => {
|
97
|
+
event: 'mouseup',
|
98
|
+
event_handler: mouse_handler,
|
99
|
+
}
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
def redraw
|
104
|
+
super()
|
105
|
+
@columns.to_a.each(&:redraw)
|
106
|
+
end
|
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
|
+
def element
|
127
|
+
'table'
|
128
|
+
end
|
129
|
+
|
130
|
+
def columns_path
|
131
|
+
path + ' thead tr'
|
132
|
+
end
|
133
|
+
|
134
|
+
def columns_dom_element
|
135
|
+
Document.find(columns_path)
|
136
|
+
end
|
137
|
+
|
138
|
+
def items_path
|
139
|
+
path + ' tbody'
|
140
|
+
end
|
141
|
+
|
142
|
+
def items_dom_element
|
143
|
+
Document.find(items_path)
|
144
|
+
end
|
145
|
+
|
146
|
+
def columns_dom
|
147
|
+
tr {
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
151
|
+
def thead_dom
|
152
|
+
thead {
|
153
|
+
columns_dom
|
154
|
+
}
|
155
|
+
end
|
156
|
+
|
157
|
+
def items_dom
|
158
|
+
tbody {
|
159
|
+
}
|
160
|
+
end
|
161
|
+
|
162
|
+
def dom
|
163
|
+
table_id = id
|
164
|
+
table_id_style = css
|
165
|
+
table_id_css_classes = css_classes
|
166
|
+
table_id_css_classes << 'table'
|
167
|
+
table_id_css_classes_string = table_id_css_classes.to_a.join(' ')
|
168
|
+
@dom ||= html {
|
169
|
+
table(id: table_id, style: table_id_style, class: table_id_css_classes_string) {
|
170
|
+
thead_dom
|
171
|
+
items_dom
|
172
|
+
}
|
173
|
+
}.to_s
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|