glimmer-dsl-opal 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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