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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +57 -28
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal.rb +26 -11
  6. data/lib/glimmer/data_binding/element_binding.rb +1 -1
  7. data/lib/glimmer/data_binding/ext/observable_model.rb +4 -4
  8. data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
  9. data/lib/glimmer/data_binding/table_items_binding.rb +3 -3
  10. data/lib/glimmer/dsl/opal/column_properties_expression.rb +2 -2
  11. data/lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb +2 -2
  12. data/lib/glimmer/dsl/opal/dsl.rb +4 -16
  13. data/lib/glimmer/dsl/opal/layout_data_expression.rb +2 -2
  14. data/lib/glimmer/dsl/opal/{text_expression.rb → layout_expression.rb} +5 -5
  15. data/lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb +2 -3
  16. data/lib/glimmer/dsl/opal/message_box_expression.rb +2 -2
  17. data/lib/glimmer/dsl/opal/shell_expression.rb +2 -2
  18. data/lib/glimmer/dsl/opal/table_expression.rb +2 -2
  19. data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +2 -2
  20. data/lib/glimmer/dsl/opal/widget_expression.rb +23 -0
  21. data/lib/glimmer/opal/display_proxy.rb +3 -3
  22. data/lib/glimmer/opal/element_proxy.rb +11 -3
  23. data/lib/glimmer/swt/browser_proxy.rb +27 -0
  24. data/lib/glimmer/swt/button_proxy.rb +40 -0
  25. data/lib/glimmer/{opal/select_proxy.rb → swt/combo_proxy.rb} +14 -10
  26. data/lib/glimmer/{opal/div_proxy.rb → swt/composite_proxy.rb} +8 -6
  27. data/lib/glimmer/{opal → swt}/event_listener_proxy.rb +1 -1
  28. data/lib/glimmer/{opal → swt}/grid_layout_proxy.rb +5 -18
  29. data/lib/glimmer/swt/label_proxy.rb +30 -0
  30. data/lib/glimmer/{opal → swt}/layout_data_proxy.rb +3 -3
  31. data/lib/glimmer/swt/layout_proxy.rb +60 -0
  32. data/lib/glimmer/{opal → swt}/list_proxy.rb +16 -13
  33. data/lib/glimmer/{opal/modal.rb → swt/message_box_proxy.rb} +61 -9
  34. data/lib/glimmer/{opal → swt}/point.rb +1 -1
  35. data/lib/glimmer/{opal → swt}/property_owner.rb +1 -1
  36. data/lib/glimmer/swt/shell_proxy.rb +235 -0
  37. data/lib/glimmer/{opal/tab_folder.rb → swt/tab_folder_proxy.rb} +13 -14
  38. data/lib/glimmer/{opal/tab_item.rb → swt/tab_item_proxy.rb} +37 -34
  39. data/lib/glimmer/{opal/table_column.rb → swt/table_column_proxy.rb} +13 -7
  40. data/lib/glimmer/{opal/table_item.rb → swt/table_item_proxy.rb} +59 -48
  41. data/lib/glimmer/swt/table_proxy.rb +177 -0
  42. data/lib/glimmer/swt/text_proxy.rb +46 -0
  43. data/lib/glimmer/swt/widget_proxy.rb +389 -0
  44. data/lib/jquery.js +2 -0
  45. data/lib/samples/elaborate/contact_manager.rb +1 -1
  46. data/lib/samples/hello/hello_computed.rb +19 -19
  47. metadata +79 -55
  48. data/lib/glimmer/dsl/opal/browser_expression.rb +0 -17
  49. data/lib/glimmer/dsl/opal/button_expression.rb +0 -18
  50. data/lib/glimmer/dsl/opal/combo_expression.rb +0 -17
  51. data/lib/glimmer/dsl/opal/composite_expression.rb +0 -17
  52. data/lib/glimmer/dsl/opal/grid_layout_expression.rb +0 -17
  53. data/lib/glimmer/dsl/opal/label_expression.rb +0 -17
  54. data/lib/glimmer/dsl/opal/list_expression.rb +0 -17
  55. data/lib/glimmer/dsl/opal/tab_folder_expression.rb +0 -17
  56. data/lib/glimmer/dsl/opal/tab_item_expression.rb +0 -17
  57. data/lib/glimmer/opal/document_proxy.rb +0 -187
  58. data/lib/glimmer/opal/iframe_proxy.rb +0 -23
  59. data/lib/glimmer/opal/input_proxy.rb +0 -45
  60. data/lib/glimmer/opal/label_proxy.rb +0 -25
  61. data/lib/glimmer/opal/table_proxy.rb +0 -149
@@ -1,32 +1,32 @@
1
- require 'glimmer/opal/div_proxy'
1
+ require 'glimmer/swt/composite_proxy'
2
2
 
3
3
  module Glimmer
4
- module Opal
5
- class TabItem < DivProxy
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 do
12
+ content {
13
13
  on_widget_selected {
14
14
  @parent.hide_all_tab_content
15
15
  show
16
16
  }
17
- end
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
- old_tab_dom.replace tab_dom
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
- tab_id = id + '-tab'
68
- tab_text = text
69
- tab_active = content_visible ? 'active' : ''
70
- @tab_dom ||= DOM {
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
- if content_visible
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
- if !@parent.tabs.include?(self)
87
- @parent.tabs_dom << tab_dom
88
- @parent.tabs << self
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/opal/element_proxy'
1
+ require 'glimmer/swt/widget_proxy'
2
2
 
3
3
  module Glimmer
4
- module Opal
5
- class TableColumn < ElementProxy
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 name
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
- @dom ||= DOM {
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
- require 'glimmer/opal/element_proxy'
1
+ require 'glimmer/swt/widget_proxy'
2
2
 
3
3
  module Glimmer
4
- module Opal
5
- class TableItem < ElementProxy
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 name
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
- parent.dom.css("tr td:nth-child(#{column_index + 1})").first.width
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
- table_item_edit_column_index = @edit_column_index
81
- table_item_max_width = max_column_width(table_item_edit_column_index) if table_item_edit_column_index
82
- table_item_edit_handler = lambda do |event, cancel = false|
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 table_item_edit_column_index == column_index
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
- }.tap do |the_dom|
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