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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/README.md +1003 -58
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal.rb +26 -8
  6. data/lib/glimmer/data_binding/element_binding.rb +1 -1
  7. data/lib/glimmer/data_binding/ext/observable_model.rb +40 -0
  8. data/lib/glimmer/data_binding/list_selection_binding.rb +1 -1
  9. data/lib/glimmer/data_binding/table_items_binding.rb +70 -0
  10. data/lib/glimmer/dsl/opal/async_exec_expression.rb +17 -0
  11. data/lib/glimmer/dsl/opal/column_properties_expression.rb +22 -0
  12. data/lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb +2 -2
  13. data/lib/glimmer/dsl/opal/dsl.rb +10 -12
  14. data/lib/glimmer/dsl/opal/layout_data_expression.rb +2 -2
  15. data/lib/glimmer/dsl/opal/{text_expression.rb → layout_expression.rb} +5 -5
  16. data/lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb +2 -3
  17. data/lib/glimmer/dsl/opal/message_box_expression.rb +20 -0
  18. data/lib/glimmer/dsl/opal/observe_expression.rb +32 -0
  19. data/lib/glimmer/dsl/opal/shell_expression.rb +2 -2
  20. data/lib/glimmer/dsl/opal/{composite_expression.rb → table_column_expression.rb} +3 -3
  21. data/lib/glimmer/dsl/opal/{list_expression.rb → table_expression.rb} +3 -3
  22. data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +29 -0
  23. data/lib/glimmer/dsl/opal/widget_expression.rb +23 -0
  24. data/lib/glimmer/opal/display_proxy.rb +23 -0
  25. data/lib/glimmer/opal/element_proxy.rb +48 -13
  26. data/lib/glimmer/swt/browser_proxy.rb +27 -0
  27. data/lib/glimmer/swt/button_proxy.rb +40 -0
  28. data/lib/glimmer/{opal/select_proxy.rb → swt/combo_proxy.rb} +15 -11
  29. data/lib/glimmer/swt/composite_proxy.rb +31 -0
  30. data/lib/glimmer/{opal → swt}/event_listener_proxy.rb +1 -1
  31. data/lib/glimmer/{opal → swt}/grid_layout_proxy.rb +7 -18
  32. data/lib/glimmer/swt/label_proxy.rb +30 -0
  33. data/lib/glimmer/swt/layout_data_proxy.rb +52 -0
  34. data/lib/glimmer/swt/layout_proxy.rb +60 -0
  35. data/lib/glimmer/{opal → swt}/list_proxy.rb +18 -15
  36. data/lib/glimmer/swt/message_box_proxy.rb +146 -0
  37. data/lib/glimmer/{opal → swt}/point.rb +1 -1
  38. data/lib/glimmer/{opal → swt}/property_owner.rb +1 -1
  39. data/lib/glimmer/swt/shell_proxy.rb +235 -0
  40. data/lib/glimmer/swt/tab_folder_proxy.rb +52 -0
  41. data/lib/glimmer/swt/tab_item_proxy.rb +101 -0
  42. data/lib/glimmer/swt/table_column_proxy.rb +56 -0
  43. data/lib/glimmer/swt/table_item_proxy.rb +147 -0
  44. data/lib/glimmer/swt/table_proxy.rb +177 -0
  45. data/lib/glimmer/swt/text_proxy.rb +46 -0
  46. data/lib/glimmer/swt/widget_proxy.rb +389 -0
  47. data/lib/jquery.js +2 -0
  48. data/lib/samples/elaborate/contact_manager.rb +2 -3
  49. data/lib/samples/elaborate/login.rb +0 -1
  50. data/lib/samples/elaborate/tic_tac_toe.rb +5 -5
  51. data/lib/samples/hello/hello_computed.rb +19 -19
  52. data/lib/samples/hello/hello_tab.rb +2 -2
  53. metadata +92 -59
  54. data/lib/glimmer/config.rb +0 -22
  55. data/lib/glimmer/dsl/engine.rb +0 -193
  56. data/lib/glimmer/dsl/expression.rb +0 -42
  57. data/lib/glimmer/dsl/expression_handler.rb +0 -48
  58. data/lib/glimmer/dsl/opal/browser_expression.rb +0 -17
  59. data/lib/glimmer/dsl/opal/button_expression.rb +0 -18
  60. data/lib/glimmer/dsl/opal/combo_expression.rb +0 -17
  61. data/lib/glimmer/dsl/opal/grid_layout_expression.rb +0 -17
  62. data/lib/glimmer/dsl/opal/label_expression.rb +0 -17
  63. data/lib/glimmer/dsl/parent_expression.rb +0 -12
  64. data/lib/glimmer/dsl/static_expression.rb +0 -36
  65. data/lib/glimmer/dsl/top_level_expression.rb +0 -7
  66. data/lib/glimmer/error.rb +0 -6
  67. data/lib/glimmer/invalid_keyword_error.rb +0 -6
  68. data/lib/glimmer/opal/div_proxy.rb +0 -20
  69. data/lib/glimmer/opal/document_proxy.rb +0 -90
  70. data/lib/glimmer/opal/iframe_proxy.rb +0 -23
  71. data/lib/glimmer/opal/input_proxy.rb +0 -41
  72. data/lib/glimmer/opal/label_proxy.rb +0 -25
  73. data/lib/glimmer/opal/layout_data_proxy.rb +0 -31
@@ -1,4 +1,3 @@
1
- require "java"
2
1
  require "observer"
3
2
 
4
3
  #Presents login screen data
@@ -37,11 +37,11 @@ class TicTacToe
37
37
  display_game_over_message("Draw!")
38
38
  end
39
39
 
40
- def display_game_over_message(message)
41
- message_box = MessageBox.new(@shell.swt_widget)
42
- message_box.setText("Game Over")
43
- message_box.setMessage(message)
44
- message_box.open
40
+ def display_game_over_message(message_text)
41
+ message_box(@shell) {
42
+ text 'Game Over'
43
+ message message_text
44
+ }.open
45
45
  @tic_tac_toe_board.reset
46
46
  end
47
47
 
@@ -1,19 +1,19 @@
1
- require_relative "hello_computed/contact"
1
+ require_relative 'hello_computed/contact'
2
2
 
3
3
  class HelloComputed
4
4
  include Glimmer
5
5
 
6
6
  def initialize
7
7
  @contact = Contact.new(
8
- first_name: "Barry",
9
- last_name: "McKibbin",
8
+ first_name: 'Barry',
9
+ last_name: 'McKibbin',
10
10
  year_of_birth: 1985
11
11
  )
12
12
  end
13
13
 
14
14
  def launch
15
15
  shell {
16
- text "Hello Computed"
16
+ text 'Hello, Computed!'
17
17
  composite {
18
18
  grid_layout {
19
19
  num_columns 2
@@ -21,44 +21,44 @@ class HelloComputed
21
21
  horizontal_spacing 20
22
22
  vertical_spacing 10
23
23
  }
24
- label {text "First &Name: "}
24
+ label {text 'First &Name: '}
25
25
  text {
26
26
  text bind(@contact, :first_name)
27
27
  layout_data {
28
- horizontalAlignment :fill
29
- grabExcessHorizontalSpace true
28
+ horizontal_alignment :fill
29
+ grab_excess_horizontal_space true
30
30
  }
31
31
  }
32
- label {text "&Last Name: "}
32
+ label {text '&Last Name: '}
33
33
  text {
34
34
  text bind(@contact, :last_name)
35
35
  layout_data {
36
- horizontalAlignment :fill
37
- grabExcessHorizontalSpace true
36
+ horizontal_alignment :fill
37
+ grab_excess_horizontal_space true
38
38
  }
39
39
  }
40
- label {text "&Year of Birth: "}
40
+ label {text '&Year of Birth: '}
41
41
  text {
42
42
  text bind(@contact, :year_of_birth)
43
43
  layout_data {
44
- horizontalAlignment :fill
45
- grabExcessHorizontalSpace true
44
+ horizontal_alignment :fill
45
+ grab_excess_horizontal_space true
46
46
  }
47
47
  }
48
- label {text "Name: "}
48
+ label {text 'Name: '}
49
49
  label {
50
50
  text bind(@contact, :name, computed_by: [:first_name, :last_name])
51
51
  layout_data {
52
- horizontalAlignment :fill
53
- grabExcessHorizontalSpace true
52
+ horizontal_alignment :fill
53
+ grab_excess_horizontal_space true
54
54
  }
55
55
  }
56
- label {text "Age: "}
56
+ label {text 'Age: '}
57
57
  label {
58
58
  text bind(@contact, :age, on_write: :to_i, computed_by: [:year_of_birth])
59
59
  layout_data {
60
- horizontalAlignment :fill
61
- grabExcessHorizontalSpace true
60
+ horizontal_alignment :fill
61
+ grab_excess_horizontal_space true
62
62
  }
63
63
  }
64
64
  }
@@ -2,7 +2,7 @@ class HelloTab
2
2
  include Glimmer
3
3
  def launch
4
4
  shell {
5
- text "Hello Tab"
5
+ text "Hello, Tab!"
6
6
  tab_folder {
7
7
  tab_item {
8
8
  text "English"
@@ -13,7 +13,7 @@ class HelloTab
13
13
  tab_item {
14
14
  text "French"
15
15
  label {
16
- text "Bonjour Univers!"
16
+ text "Bonjour, Univers!"
17
17
  }
18
18
  }
19
19
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-18 00:00:00.000000000 Z
11
+ date: 2020-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -16,42 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.2
19
+ version: 0.9.5
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.2
26
+ version: 0.9.5
27
27
  - !ruby/object:Gem::Dependency
28
- name: rspec-mocks
28
+ name: glimmer-dsl-xml
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.5.0
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: 3.5.0
41
- - !ruby/object:Gem::Dependency
42
- name: rspec
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: 3.5.0
48
- type: :development
33
+ version: 0.1.0
34
+ type: :runtime
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: 3.5.0
40
+ version: 0.1.0
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: puts_debuggerer
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -132,28 +118,70 @@ dependencies:
132
118
  requirements:
133
119
  - - "~>"
134
120
  - !ruby/object:Gem::Version
135
- version: 0.7.1
121
+ version: 0.8.0.alpha2
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: 0.8.0.alpha2
129
+ - !ruby/object:Gem::Dependency
130
+ name: opal-rails
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: 1.1.2
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: 1.1.2
143
+ - !ruby/object:Gem::Dependency
144
+ name: opal-async
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: 1.1.0
136
150
  type: :development
137
151
  prerelease: false
138
152
  version_requirements: !ruby/object:Gem::Requirement
139
153
  requirements:
140
154
  - - "~>"
141
155
  - !ruby/object:Gem::Version
142
- version: 0.7.1
156
+ version: 1.1.0
143
157
  - !ruby/object:Gem::Dependency
144
- name: opal-browser
158
+ name: opal-jquery
145
159
  requirement: !ruby/object:Gem::Requirement
146
160
  requirements:
147
161
  - - "~>"
148
162
  - !ruby/object:Gem::Version
149
- version: 0.2.0
163
+ version: 0.4.4
150
164
  type: :development
151
165
  prerelease: false
152
166
  version_requirements: !ruby/object:Gem::Requirement
153
167
  requirements:
154
168
  - - "~>"
155
169
  - !ruby/object:Gem::Version
156
- version: 0.2.0
170
+ version: 0.4.4
171
+ - !ruby/object:Gem::Dependency
172
+ name: glimmer-dsl-opal
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
157
185
  description: Glimmer DSL for Opal (Web GUI Adapter for Desktop Apps)
158
186
  email: andy.am@gmail.com
159
187
  executables: []
@@ -168,48 +196,53 @@ files:
168
196
  - README.md
169
197
  - VERSION
170
198
  - lib/glimmer-dsl-opal.rb
171
- - lib/glimmer/config.rb
172
199
  - lib/glimmer/data_binding/element_binding.rb
200
+ - lib/glimmer/data_binding/ext/observable_model.rb
173
201
  - lib/glimmer/data_binding/list_selection_binding.rb
174
202
  - lib/glimmer/data_binding/observable_element.rb
175
- - lib/glimmer/dsl/engine.rb
176
- - lib/glimmer/dsl/expression.rb
177
- - lib/glimmer/dsl/expression_handler.rb
203
+ - lib/glimmer/data_binding/table_items_binding.rb
204
+ - lib/glimmer/dsl/opal/async_exec_expression.rb
178
205
  - lib/glimmer/dsl/opal/bind_expression.rb
179
- - lib/glimmer/dsl/opal/browser_expression.rb
180
- - lib/glimmer/dsl/opal/button_expression.rb
181
- - lib/glimmer/dsl/opal/combo_expression.rb
206
+ - lib/glimmer/dsl/opal/column_properties_expression.rb
182
207
  - lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb
183
- - lib/glimmer/dsl/opal/composite_expression.rb
184
208
  - lib/glimmer/dsl/opal/data_binding_expression.rb
185
209
  - lib/glimmer/dsl/opal/dsl.rb
186
- - lib/glimmer/dsl/opal/grid_layout_expression.rb
187
- - lib/glimmer/dsl/opal/label_expression.rb
188
210
  - lib/glimmer/dsl/opal/layout_data_expression.rb
189
- - lib/glimmer/dsl/opal/list_expression.rb
211
+ - lib/glimmer/dsl/opal/layout_expression.rb
190
212
  - lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb
213
+ - lib/glimmer/dsl/opal/message_box_expression.rb
214
+ - lib/glimmer/dsl/opal/observe_expression.rb
191
215
  - lib/glimmer/dsl/opal/property_expression.rb
192
216
  - lib/glimmer/dsl/opal/shell_expression.rb
193
- - lib/glimmer/dsl/opal/text_expression.rb
217
+ - lib/glimmer/dsl/opal/table_column_expression.rb
218
+ - lib/glimmer/dsl/opal/table_expression.rb
219
+ - lib/glimmer/dsl/opal/table_items_data_binding_expression.rb
220
+ - lib/glimmer/dsl/opal/widget_expression.rb
194
221
  - lib/glimmer/dsl/opal/widget_listener_expression.rb
195
- - lib/glimmer/dsl/parent_expression.rb
196
- - lib/glimmer/dsl/static_expression.rb
197
- - lib/glimmer/dsl/top_level_expression.rb
198
- - lib/glimmer/error.rb
199
- - lib/glimmer/invalid_keyword_error.rb
200
- - lib/glimmer/opal/div_proxy.rb
201
- - lib/glimmer/opal/document_proxy.rb
222
+ - lib/glimmer/opal/display_proxy.rb
202
223
  - lib/glimmer/opal/element_proxy.rb
203
- - lib/glimmer/opal/event_listener_proxy.rb
204
- - lib/glimmer/opal/grid_layout_proxy.rb
205
- - lib/glimmer/opal/iframe_proxy.rb
206
- - lib/glimmer/opal/input_proxy.rb
207
- - lib/glimmer/opal/label_proxy.rb
208
- - lib/glimmer/opal/layout_data_proxy.rb
209
- - lib/glimmer/opal/list_proxy.rb
210
- - lib/glimmer/opal/point.rb
211
- - lib/glimmer/opal/property_owner.rb
212
- - lib/glimmer/opal/select_proxy.rb
224
+ - lib/glimmer/swt/browser_proxy.rb
225
+ - lib/glimmer/swt/button_proxy.rb
226
+ - lib/glimmer/swt/combo_proxy.rb
227
+ - lib/glimmer/swt/composite_proxy.rb
228
+ - lib/glimmer/swt/event_listener_proxy.rb
229
+ - lib/glimmer/swt/grid_layout_proxy.rb
230
+ - lib/glimmer/swt/label_proxy.rb
231
+ - lib/glimmer/swt/layout_data_proxy.rb
232
+ - lib/glimmer/swt/layout_proxy.rb
233
+ - lib/glimmer/swt/list_proxy.rb
234
+ - lib/glimmer/swt/message_box_proxy.rb
235
+ - lib/glimmer/swt/point.rb
236
+ - lib/glimmer/swt/property_owner.rb
237
+ - lib/glimmer/swt/shell_proxy.rb
238
+ - lib/glimmer/swt/tab_folder_proxy.rb
239
+ - lib/glimmer/swt/tab_item_proxy.rb
240
+ - lib/glimmer/swt/table_column_proxy.rb
241
+ - lib/glimmer/swt/table_item_proxy.rb
242
+ - lib/glimmer/swt/table_proxy.rb
243
+ - lib/glimmer/swt/text_proxy.rb
244
+ - lib/glimmer/swt/widget_proxy.rb
245
+ - lib/jquery.js
213
246
  - lib/samples/elaborate/contact_manager.rb
214
247
  - lib/samples/elaborate/contact_manager/contact.rb
215
248
  - lib/samples/elaborate/contact_manager/contact_manager_presenter.rb
@@ -233,7 +266,7 @@ homepage: http://github.com/AndyObtiva/glimmer-dsl-opal
233
266
  licenses:
234
267
  - MIT
235
268
  metadata: {}
236
- post_install_message:
269
+ post_install_message:
237
270
  rdoc_options: []
238
271
  require_paths:
239
272
  - lib
@@ -249,7 +282,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
249
282
  version: '0'
250
283
  requirements: []
251
284
  rubygems_version: 3.1.2
252
- signing_key:
285
+ signing_key:
253
286
  specification_version: 4
254
287
  summary: Glimmer DSL for Opal
255
288
  test_files: []
@@ -1,22 +0,0 @@
1
- module Glimmer
2
- module Config
3
- class << self
4
- # Returns Glimmer logger (standard Ruby logger)
5
- def logger
6
- # unless defined? @@logger
7
- # @@logger = Logger.new(STDOUT).tap {|logger| logger.level = Logger::WARN}
8
- # end
9
- @@logger if defined? @@logger
10
- end
11
-
12
- def enable_logging
13
- @@logger = Logger.new(STDOUT).tap {|logger| logger.level = Logger::WARN}
14
- end
15
- end
16
- end
17
- end
18
-
19
- if ENV['GLIMMER_LOGGER_LEVEL']
20
- Glimmer::Config.enable_logging
21
- Glimmer::Config.logger.level = ENV['GLIMMER_LOGGER_LEVEL'].downcase
22
- end
@@ -1,193 +0,0 @@
1
- require 'glimmer'
2
- require 'glimmer/dsl/expression_handler'
3
-
4
- module Glimmer
5
- module DSL
6
- # Glimmer DSL Engine
7
- #
8
- # Follows Interpreter and Chain of Responsibility Design Patterns
9
- #
10
- # When DSL engine interprets an expression, it attempts to handle
11
- # with ordered expression array specified via `.expressions=` method.
12
- class Engine
13
- class << self
14
- def dsl=(dsl_name)
15
- dsl_name = dsl_name&.to_sym
16
- if dsl_name
17
- dsl_stack.push(dsl_name)
18
- else
19
- dsl_stack.clear
20
- end
21
- end
22
-
23
- def dsl
24
- dsl_stack.last
25
- end
26
-
27
- def dsls
28
- static_expressions.values.map(&:keys).flatten.uniq
29
- end
30
-
31
- def disable_dsl(dsl_name)
32
- dsl_name = dsl_name.to_sym
33
- disabled_dsls << dsl_name
34
- end
35
-
36
- def enable_dsl(dsl_name)
37
- dsl_name = dsl_name.to_sym
38
- disabled_dsls.delete(dsl_name)
39
- end
40
-
41
- def disabled_dsls
42
- @disabled_dsls ||= []
43
- end
44
-
45
- def enabled_dsls=(dsl_names)
46
- dsls.each {|dsl_name| disable_dsl(dsl_name)}
47
- dsl_names.each {|dsl_name| enable_dsl(dsl_name)}
48
- end
49
-
50
- # Resets Glimmer's engine activity and configuration. Useful in rspec before or after blocks in tests.
51
- def reset
52
- parent_stacks.values.each do |a_parent_stack|
53
- a_parent_stack.clear
54
- end
55
- dsl_stack.clear
56
- disabled_dsls.clear
57
- end
58
-
59
- # Dynamic expression chains of responsibility indexed by dsl
60
- def dynamic_expression_chains_of_responsibility
61
- @dynamic_expression_chains_of_responsibility ||= {}
62
- end
63
-
64
- # Static expressions indexed by keyword and dsl
65
- def static_expressions
66
- @static_expressions ||= {}
67
- end
68
-
69
- # Sets an ordered array of DSL expressions to support
70
- #
71
- # Every expression has an underscored name corresponding to an upper
72
- # camelcase AbstractExpression subclass name in glimmer/dsl
73
- #
74
- # They are used in order following the Chain of Responsibility Design
75
- # Pattern when interpretting a DSL expression
76
- def add_dynamic_expressions(dsl_namespace, expression_names)
77
- dsl = dsl_namespace.name.split("::").last.downcase.to_sym
78
- dynamic_expression_chains_of_responsibility[dsl] = expression_names.reverse.map do |expression_name|
79
- expression_class(dsl_namespace, expression_name).new
80
- end.reduce(nil) do |last_expresion_handler, expression|
81
- Glimmer::Config.logger&.debug "Adding dynamic expression: #{expression.class.name}"
82
- expression_handler = ExpressionHandler.new(expression)
83
- expression_handler.next = last_expresion_handler if last_expresion_handler
84
- expression_handler
85
- end
86
- end
87
-
88
- def add_static_expression(static_expression)
89
- Glimmer::Config.logger&.debug "Adding static expression: #{static_expression.class.name}"
90
- keyword = static_expression.class.keyword
91
- static_expression_dsl = static_expression.class.dsl
92
- static_expressions[keyword] ||= {}
93
- static_expressions[keyword][static_expression_dsl] = static_expression
94
- Glimmer.send(:define_method, keyword) do |*args, &block|
95
- begin
96
- retrieved_static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
97
- static_expression_dsl = (Glimmer::DSL::Engine.static_expressions[keyword].keys - Glimmer::DSL::Engine.disabled_dsls).last if retrieved_static_expression.nil?
98
- interpretation = nil
99
- if retrieved_static_expression.nil? && Glimmer::DSL::Engine.dsl && (static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression))
100
- begin
101
- interpretation = Glimmer::DSL::Engine.interpret(keyword, *args, &block)
102
- rescue => e
103
- Glimmer::DSL::Engine.reset
104
- raise e if static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression)
105
- end
106
- end
107
- if interpretation
108
- interpretation
109
- else
110
- raise Glimmer::Error, "Unsupported keyword: #{keyword}" unless static_expression_dsl || retrieved_static_expression
111
- Glimmer::DSL::Engine.dsl_stack.push(static_expression_dsl || Glimmer::DSL::Engine.dsl)
112
- static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
113
- if !static_expression.can_interpret?(Glimmer::DSL::Engine.parent, keyword, *args, &block)
114
- raise Error, "Invalid use of Glimmer keyword #{keyword} with args #{args} under parent #{Glimmer::DSL::Engine.parent}"
115
- else
116
- Glimmer::Config.logger&.debug "#{static_expression.class.name} will handle expression keyword #{keyword}"
117
- static_expression.interpret(Glimmer::DSL::Engine.parent, keyword, *args, &block).tap do |ui_object|
118
- Glimmer::DSL::Engine.add_content(ui_object, static_expression, &block) unless block.nil?
119
- Glimmer::DSL::Engine.dsl_stack.pop
120
- end
121
- end
122
- end
123
- rescue StandardError => e
124
- # Glimmer::DSL::Engine.dsl_stack.pop
125
- Glimmer::DSL::Engine.reset
126
- raise e
127
- end
128
- end
129
- end
130
-
131
- def expression_class(dsl_namespace, expression_name)
132
- dsl_namespace.const_get(expression_class_name(expression_name).to_sym)
133
- end
134
-
135
- def expression_class_name(expression_name)
136
- "#{expression_name}_expression".camelcase(:upper)
137
- end
138
-
139
- # Interprets Glimmer dynamic DSL expression consisting of keyword, args, and block (e.g. shell(:no_resize) { ... })
140
- def interpret(keyword, *args, &block)
141
- keyword = keyword.to_s
142
- dynamic_expression_dsl = (dynamic_expression_chains_of_responsibility.keys - disabled_dsls).last if dsl.nil?
143
- dsl_stack.push(dynamic_expression_dsl || dsl)
144
- expression = dynamic_expression_chains_of_responsibility[dsl].handle(parent, keyword, *args, &block)
145
- expression.interpret(parent, keyword, *args, &block).tap do |ui_object|
146
- add_content(ui_object, expression, &block)
147
- dsl_stack.pop
148
- end
149
- rescue StandardError => e
150
- # dsl_stack.pop
151
- reset
152
- raise e
153
- end
154
-
155
- # Adds content block to parent UI object
156
- #
157
- # This allows evaluating parent UI object properties and children
158
- #
159
- # For example, a shell widget would get properties set and children added
160
- def add_content(parent, expression, &block)
161
- if block_given? && expression.is_a?(ParentExpression)
162
- dsl_stack.push(expression.class.dsl)
163
- parent_stack.push(parent)
164
- expression.add_content(parent, &block)
165
- parent_stack.pop
166
- dsl_stack.pop
167
- end
168
- end
169
-
170
- # Current parent while evaluating Glimmer DSL (nil if just started or done evaluatiing)
171
- #
172
- # Parents are maintained in a stack while evaluating Glimmer DSL
173
- # to ensure properly ordered interpretation of DSL syntax
174
- def parent
175
- parent_stack.last
176
- end
177
-
178
- def parent_stack
179
- parent_stacks[dsl] ||= []
180
- end
181
-
182
- def parent_stacks
183
- @parent_stacks ||= {}
184
- end
185
-
186
- # Enables multiple DSLs to play well with each other when mixing together
187
- def dsl_stack
188
- @dsl_stack ||= []
189
- end
190
- end
191
- end
192
- end
193
- end