glimmer 0.8.2 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +823 -297
  4. data/VERSION +1 -1
  5. data/lib/glimmer.rb +35 -21
  6. data/lib/glimmer/config.rb +7 -12
  7. data/lib/glimmer/data_binding/observable_array.rb +32 -53
  8. data/lib/glimmer/data_binding/observable_model.rb +12 -16
  9. data/lib/glimmer/data_binding/observer.rb +3 -0
  10. data/lib/glimmer/dsl/engine.rb +58 -27
  11. data/lib/glimmer/dsl/expression.rb +0 -7
  12. data/lib/glimmer/dsl/static_expression.rb +2 -2
  13. data/lib/glimmer/excluded_keyword_error.rb +5 -0
  14. metadata +60 -142
  15. data/RUBY_VERSION +0 -1
  16. data/bin/girb +0 -10
  17. data/bin/girb_runner.rb +0 -13
  18. data/bin/glimmer +0 -5
  19. data/icons/scaffold_app.icns +0 -0
  20. data/lib/glimmer/css/rule.rb +0 -25
  21. data/lib/glimmer/css/style_sheet.rb +0 -19
  22. data/lib/glimmer/data_binding/list_selection_binding.rb +0 -52
  23. data/lib/glimmer/data_binding/observable_widget.rb +0 -17
  24. data/lib/glimmer/data_binding/shine.rb +0 -23
  25. data/lib/glimmer/data_binding/table_items_binding.rb +0 -56
  26. data/lib/glimmer/data_binding/tree_items_binding.rb +0 -71
  27. data/lib/glimmer/data_binding/widget_binding.rb +0 -33
  28. data/lib/glimmer/dsl/css/css_expression.rb +0 -21
  29. data/lib/glimmer/dsl/css/dsl.rb +0 -10
  30. data/lib/glimmer/dsl/css/dynamic_property_expression.rb +0 -12
  31. data/lib/glimmer/dsl/css/property_expression.rb +0 -22
  32. data/lib/glimmer/dsl/css/pv_expression.rb +0 -17
  33. data/lib/glimmer/dsl/css/rule_expression.rb +0 -25
  34. data/lib/glimmer/dsl/css/s_expression.rb +0 -26
  35. data/lib/glimmer/dsl/swt/async_exec_expression.rb +0 -14
  36. data/lib/glimmer/dsl/swt/bind_expression.rb +0 -37
  37. data/lib/glimmer/dsl/swt/color_expression.rb +0 -19
  38. data/lib/glimmer/dsl/swt/column_properties_expression.rb +0 -24
  39. data/lib/glimmer/dsl/swt/combo_selection_data_binding_expression.rb +0 -42
  40. data/lib/glimmer/dsl/swt/custom_widget_expression.rb +0 -36
  41. data/lib/glimmer/dsl/swt/data_binding_expression.rb +0 -34
  42. data/lib/glimmer/dsl/swt/dialog_expression.rb +0 -26
  43. data/lib/glimmer/dsl/swt/display_expression.rb +0 -19
  44. data/lib/glimmer/dsl/swt/dsl.rb +0 -28
  45. data/lib/glimmer/dsl/swt/exec_expression.rb +0 -28
  46. data/lib/glimmer/dsl/swt/layout_data_expression.rb +0 -25
  47. data/lib/glimmer/dsl/swt/layout_expression.rb +0 -27
  48. data/lib/glimmer/dsl/swt/list_selection_data_binding_expression.rb +0 -44
  49. data/lib/glimmer/dsl/swt/menu_bar_expression.rb +0 -33
  50. data/lib/glimmer/dsl/swt/menu_expression.rb +0 -32
  51. data/lib/glimmer/dsl/swt/message_box_expression.rb +0 -29
  52. data/lib/glimmer/dsl/swt/observe_expression.rb +0 -32
  53. data/lib/glimmer/dsl/swt/property_expression.rb +0 -22
  54. data/lib/glimmer/dsl/swt/rgb_expression.rb +0 -12
  55. data/lib/glimmer/dsl/swt/rgba_expression.rb +0 -12
  56. data/lib/glimmer/dsl/swt/shell_expression.rb +0 -25
  57. data/lib/glimmer/dsl/swt/swt_expression.rb +0 -25
  58. data/lib/glimmer/dsl/swt/sync_exec_expression.rb +0 -15
  59. data/lib/glimmer/dsl/swt/tab_item_expression.rb +0 -33
  60. data/lib/glimmer/dsl/swt/table_items_data_binding_expression.rb +0 -31
  61. data/lib/glimmer/dsl/swt/tree_items_data_binding_expression.rb +0 -31
  62. data/lib/glimmer/dsl/swt/tree_properties_expression.rb +0 -26
  63. data/lib/glimmer/dsl/swt/widget_expression.rb +0 -35
  64. data/lib/glimmer/dsl/swt/widget_listener_expression.rb +0 -32
  65. data/lib/glimmer/dsl/xml/dsl.rb +0 -11
  66. data/lib/glimmer/dsl/xml/html_expression.rb +0 -25
  67. data/lib/glimmer/dsl/xml/meta_expression.rb +0 -23
  68. data/lib/glimmer/dsl/xml/name_space_expression.rb +0 -37
  69. data/lib/glimmer/dsl/xml/node_parent_expression.rb +0 -33
  70. data/lib/glimmer/dsl/xml/tag_expression.rb +0 -29
  71. data/lib/glimmer/dsl/xml/text_expression.rb +0 -22
  72. data/lib/glimmer/dsl/xml/xml_expression.rb +0 -21
  73. data/lib/glimmer/launcher.rb +0 -199
  74. data/lib/glimmer/package.rb +0 -55
  75. data/lib/glimmer/rake_task.rb +0 -58
  76. data/lib/glimmer/scaffold.rb +0 -582
  77. data/lib/glimmer/swt/color_proxy.rb +0 -53
  78. data/lib/glimmer/swt/display_proxy.rb +0 -88
  79. data/lib/glimmer/swt/font_proxy.rb +0 -72
  80. data/lib/glimmer/swt/layout_data_proxy.rb +0 -84
  81. data/lib/glimmer/swt/layout_proxy.rb +0 -82
  82. data/lib/glimmer/swt/menu_proxy.rb +0 -101
  83. data/lib/glimmer/swt/message_box_proxy.rb +0 -48
  84. data/lib/glimmer/swt/packages.rb +0 -13
  85. data/lib/glimmer/swt/shell_proxy.rb +0 -152
  86. data/lib/glimmer/swt/swt_proxy.rb +0 -106
  87. data/lib/glimmer/swt/tab_item_proxy.rb +0 -65
  88. data/lib/glimmer/swt/table_proxy.rb +0 -150
  89. data/lib/glimmer/swt/tree_proxy.rb +0 -120
  90. data/lib/glimmer/swt/widget_listener_proxy.rb +0 -34
  91. data/lib/glimmer/swt/widget_proxy.rb +0 -489
  92. data/lib/glimmer/ui/custom_shell.rb +0 -45
  93. data/lib/glimmer/ui/custom_widget.rb +0 -244
  94. data/lib/glimmer/util/proc_tracker.rb +0 -16
  95. data/lib/glimmer/xml/depth_first_search_iterator.rb +0 -22
  96. data/lib/glimmer/xml/name_space_visitor.rb +0 -21
  97. data/lib/glimmer/xml/node.rb +0 -75
  98. data/lib/glimmer/xml/node_visitor.rb +0 -13
  99. data/lib/glimmer/xml/xml_visitor.rb +0 -65
  100. data/vendor/swt/linux/swt.jar +0 -0
  101. data/vendor/swt/mac/swt.jar +0 -0
  102. data/vendor/swt/windows/swt.jar +0 -0
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.2
1
+ 0.9.4
@@ -2,14 +2,12 @@
2
2
  # interfaces using the robust platform-independent Eclipse SWT library. Glimmer
3
3
  # comes with built-in data-binding support to greatly facilitate synchronizing
4
4
  # UI with domain models.
5
- require 'facets'
6
- require 'super_module'
7
5
  require 'logger'
8
- require 'java'
9
6
  require 'set'
10
- require 'nested_inherited_jruby_include_package'
11
- require 'fileutils'
12
- require 'os'
7
+
8
+ $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
9
+
10
+ require 'glimmer/config'
13
11
 
14
12
  # Glimmer provides a JRuby Desktop UI DSL + Data-Binding functionality
15
13
  #
@@ -20,24 +18,45 @@ require 'os'
20
18
  module Glimmer
21
19
  #TODO make it configurable to include or not include perhaps reverting to using included
22
20
  REGEX_METHODS_EXCLUDED = /^(to_|\[)/
23
-
21
+
22
+ # TODO add loop detection support to avoid infinite loops (perhaps breaks after 3 repetitions and provides an option to allow it if intentional)
24
23
  class << self
25
- def included(klass)
26
- if Config.import_swt_packages
27
- klass.include(SWT::Packages)
28
- klass.extend(SWT::Packages)
29
- klass.extend(Glimmer)
30
- end
24
+ attr_accessor :loop_last_data
25
+
26
+ def loop_reset!(including_loop_last_data = false)
27
+ @loop_last_data = nil if including_loop_last_data
28
+ @loop = 1
29
+ end
30
+
31
+ def loop
32
+ @loop ||= loop_reset!
33
+ end
34
+
35
+ def loop_increment!
36
+ @loop = loop + 1
31
37
  end
32
38
  end
33
39
 
34
40
  def method_missing(method_symbol, *args, &block)
41
+ new_loop_data = [method_symbol, args, block]
42
+ if new_loop_data == Glimmer.loop_last_data
43
+ Glimmer.loop_increment!
44
+ if Glimmer.loop == Config.loop_max_count
45
+ raise "Glimmer looped #{Config.loop_max_count} times with keyword '#{new_loop_data[0]}'! Check code for errors."
46
+ end
47
+ else
48
+ Glimmer.loop_reset!
49
+ end
50
+ Glimmer.loop_last_data = new_loop_data
35
51
  # This if statement speeds up Glimmer in girb or whenever directly including on main object
36
52
  if method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
37
- raise InvalidKeywordError, "Glimmer excluded keyword: #{method_symbol}"
53
+ raise ExcludedKeywordError, "Glimmer excluded keyword: #{method_symbol}"
38
54
  end
39
55
  Glimmer::Config.logger&.debug "Interpreting keyword: #{method_symbol}"
40
56
  Glimmer::DSL::Engine.interpret(method_symbol, *args, &block)
57
+ rescue ExcludedKeywordError => e
58
+ # TODO add a feature to show excluded keywords optionally for debugging purposes
59
+ super(method_symbol, *args, &block)
41
60
  rescue InvalidKeywordError => e
42
61
  if !method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
43
62
  Glimmer::Config.logger&.error e.message
@@ -47,12 +66,7 @@ module Glimmer
47
66
  end
48
67
  end
49
68
 
50
- $LOAD_PATH.unshift(File.expand_path('..', __FILE__))
51
-
52
- require 'glimmer/config'
53
- require 'glimmer/swt/packages'
54
- require 'glimmer/dsl/swt/dsl'
55
- require 'glimmer/dsl/xml/dsl'
56
- require 'glimmer/dsl/css/dsl'
57
69
  require 'glimmer/error'
70
+ require 'glimmer/excluded_keyword_error'
58
71
  require 'glimmer/invalid_keyword_error'
72
+ require 'glimmer/dsl/engine'
@@ -1,19 +1,14 @@
1
1
  module Glimmer
2
2
  module Config
3
3
  class << self
4
- # Tells Glimmer to import SWT packages into including class (default: true)
5
- def import_swt_packages=(value)
6
- @@import_swt_packages = !!value
4
+ LOOP_MAX_COUNT_DEFAULT = 100
5
+
6
+ attr_writer :loop_max_count
7
+
8
+ def loop_max_count
9
+ @loop_max_count ||= LOOP_MAX_COUNT_DEFAULT
7
10
  end
8
-
9
- # Returns whether Glimmer will import SWT packages into including class
10
- def import_swt_packages
11
- unless defined? @@import_swt_packages
12
- @@import_swt_packages = true
13
- end
14
- @@import_swt_packages
15
- end
16
-
11
+
17
12
  # Returns Glimmer logger (standard Ruby logger)
18
13
  def logger
19
14
  # unless defined? @@logger
@@ -1,6 +1,6 @@
1
1
  require 'set'
2
2
 
3
- require_relative 'observable'
3
+ require 'glimmer/data_binding/observable'
4
4
 
5
5
  module Glimmer
6
6
  module DataBinding
@@ -40,61 +40,40 @@ module Glimmer
40
40
  def notify_observers
41
41
  property_observer_list.each {|observer| observer.call}
42
42
  end
43
-
44
- def self.extend_object(array)
45
- # TODO consider alias_method, and define_method instead
46
-
47
- array.instance_eval("alias __original_add <<")
48
- array.instance_eval <<-end_eval, __FILE__, __LINE__
49
- def <<(value)
50
- self.__original_add(value)
51
- notify_observers
52
- end
53
- end_eval
54
-
55
- array.instance_eval("alias __original_set_value []=")
56
- array.instance_eval <<-end_eval, __FILE__, __LINE__
57
- def []=(index, value)
58
- old_value = self[index]
59
- unregister_dependent_observers(old_value)
60
- self.__original_set_value(index, value)
61
- notify_observers
62
- end
63
- end_eval
64
-
65
- array.instance_eval("alias __original_delete delete")
66
- array.instance_eval <<-end_eval, __FILE__, __LINE__
67
- def delete(value)
68
- unregister_dependent_observers(value)
69
- self.__original_delete(value)
70
- notify_observers
71
- end
72
- end_eval
73
-
74
- array.instance_eval("alias __original_delete_at delete_at")
75
- array.instance_eval <<-end_eval, __FILE__, __LINE__
76
- def delete_at(index)
77
- old_value = self[index]
43
+
44
+ def <<(element)
45
+ super(element)
46
+ notify_observers
47
+ end
48
+
49
+ def []=(index, value)
50
+ old_value = self[index]
51
+ unregister_dependent_observers(old_value)
52
+ super(index, value)
53
+ notify_observers
54
+ end
55
+
56
+ def delete(element)
57
+ unregister_dependent_observers(element)
58
+ super(element)
59
+ notify_observers
60
+ end
61
+
62
+ def delete_at(index)
63
+ old_value = self[index]
64
+ unregister_dependent_observers(old_value)
65
+ super(index)
66
+ notify_observers
67
+ end
68
+
69
+ def clear
70
+ each do |old_value|
78
71
  unregister_dependent_observers(old_value)
79
- self.__original_delete_at(index)
80
- notify_observers
81
72
  end
82
- end_eval
83
-
84
- array.instance_eval("alias __original_clear clear")
85
- array.instance_eval <<-end_eval, __FILE__, __LINE__
86
- def clear
87
- each do |old_value|
88
- unregister_dependent_observers(old_value)
89
- end
90
- self.__original_clear
91
- notify_observers
92
- end
93
- end_eval
94
-
95
- super
73
+ super()
74
+ notify_observers
96
75
  end
97
-
76
+
98
77
  def unregister_dependent_observers(old_value)
99
78
  # TODO look into optimizing this
100
79
  return unless old_value.is_a?(ObservableModel) || old_value.is_a?(ObservableArray)
@@ -1,7 +1,5 @@
1
- require 'glimmer'
2
-
3
- require_relative 'observable'
4
- require_relative 'observer'
1
+ require 'glimmer/data_binding/observable'
2
+ require 'glimmer/data_binding/observer'
5
3
 
6
4
  module Glimmer
7
5
  module DataBinding
@@ -58,22 +56,20 @@ module Glimmer
58
56
  method(property_writer_name)
59
57
  ensure_array_object_observer(property_name, send(property_name))
60
58
  begin
61
- method("__original_#{property_writer_name}")
59
+ singleton_method("__original_#{property_writer_name}")
62
60
  rescue
63
- # TODO consider alias_method or define_method instead
64
- instance_eval "alias __original_#{property_writer_name} #{property_writer_name}"
65
- instance_eval <<-end_eval, __FILE__, __LINE__
66
- def #{property_writer_name}(value)
67
- old_value = self.#{property_name}
68
- unregister_dependent_observers('#{property_name}', old_value)
69
- self.__original_#{property_writer_name}(value)
70
- notify_observers('#{property_name}')
71
- ensure_array_object_observer('#{property_name}', value, old_value)
61
+ old_method = self.class.instance_method(property_writer_name) rescue self.method(property_writer_name)
62
+ define_singleton_method("__original_#{property_writer_name}", old_method)
63
+ define_singleton_method(property_writer_name) do |value|
64
+ old_value = self.send(property_name)
65
+ unregister_dependent_observers(property_name, old_value)
66
+ self.send("__original_#{property_writer_name}", value)
67
+ notify_observers(property_name)
68
+ ensure_array_object_observer(property_name, value, old_value)
72
69
  end
73
- end_eval
74
70
  end
75
71
  rescue => e
76
- # ignore writing if no property writer exists
72
+ #ignore writing if no property writer exists
77
73
  Glimmer::Config.logger&.debug "No need to observe property writer: #{property_writer_name}\n#{e.message}\n#{e.backtrace.join("\n")}"
78
74
  end
79
75
 
@@ -122,3 +122,6 @@ module Glimmer
122
122
  end
123
123
  end
124
124
  end
125
+
126
+ require 'glimmer/data_binding/observable_model'
127
+ require 'glimmer/data_binding/observable_array'
@@ -1,4 +1,5 @@
1
- require 'glimmer'
1
+ require 'facets/string/camelcase'
2
+
2
3
  require 'glimmer/dsl/expression_handler'
3
4
 
4
5
  module Glimmer
@@ -10,6 +11,8 @@ module Glimmer
10
11
  # When DSL engine interprets an expression, it attempts to handle
11
12
  # with ordered expression array specified via `.expressions=` method.
12
13
  class Engine
14
+ MESSAGE_NO_DSLS = "Glimmer has no DSLs configured. Add glimmer-dsl-swt gem or visit https://github.com/AndyObtiva/glimmer#multi-dsl-support for more details.\n"
15
+
13
16
  class << self
14
17
  def dsl=(dsl_name)
15
18
  dsl_name = dsl_name&.to_sym
@@ -55,6 +58,10 @@ module Glimmer
55
58
  dsl_stack.clear
56
59
  disabled_dsls.clear
57
60
  end
61
+
62
+ def no_dsls?
63
+ static_expressions.empty? && dynamic_expression_chains_of_responsibility.empty?
64
+ end
58
65
 
59
66
  # Dynamic expression chains of responsibility indexed by dsl
60
67
  def dynamic_expression_chains_of_responsibility
@@ -64,6 +71,16 @@ module Glimmer
64
71
  # Static expressions indexed by keyword and dsl
65
72
  def static_expressions
66
73
  @static_expressions ||= {}
74
+ end
75
+
76
+ # Sets dynamic expression chains of responsibility. Useful for internal testing
77
+ def dynamic_expression_chains_of_responsibility=(chains)
78
+ @dynamic_expression_chains_of_responsibility = chains
79
+ end
80
+
81
+ # Sets static expressions. Useful for internal testing
82
+ def static_expressions=(expressions)
83
+ @static_expressions = expressions
67
84
  end
68
85
 
69
86
  # Sets an ordered array of DSL expressions to support
@@ -73,8 +90,9 @@ module Glimmer
73
90
  #
74
91
  # They are used in order following the Chain of Responsibility Design
75
92
  # 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
93
+ def add_dynamic_expressions(dsl_namespace, *expression_names)
94
+ expression_names = expression_names.flatten
95
+ dsl = dsl_namespace.name.split("::").last.downcase.to_sym
78
96
  dynamic_expression_chains_of_responsibility[dsl] = expression_names.reverse.map do |expression_name|
79
97
  expression_class(dsl_namespace, expression_name).new
80
98
  end.reduce(nil) do |last_expresion_handler, expression|
@@ -82,7 +100,7 @@ module Glimmer
82
100
  expression_handler = ExpressionHandler.new(expression)
83
101
  expression_handler.next = last_expresion_handler if last_expresion_handler
84
102
  expression_handler
85
- end
103
+ end
86
104
  end
87
105
 
88
106
  def add_static_expression(static_expression)
@@ -91,31 +109,40 @@ module Glimmer
91
109
  static_expression_dsl = static_expression.class.dsl
92
110
  static_expressions[keyword] ||= {}
93
111
  static_expressions[keyword][static_expression_dsl] = static_expression
94
- Glimmer.define_method(keyword) do |*args, &block|
112
+ Glimmer.send(:define_method, keyword) do |*args, &block|
95
113
  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).first if retrieved_static_expression.nil?
98
- 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))
99
- begin
100
- return Glimmer::DSL::Engine.interpret(keyword, *args, &block)
101
- rescue => e
102
- Glimmer::DSL::Engine.reset
103
- raise e if static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression)
104
- end
105
- end
106
- raise Glimmer::Error, "Unsupported keyword: #{keyword}" unless static_expression_dsl || retrieved_static_expression
107
- Glimmer::DSL::Engine.dsl_stack.push(static_expression_dsl || Glimmer::DSL::Engine.dsl)
108
- static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
109
- if !static_expression.can_interpret?(Glimmer::DSL::Engine.parent, keyword, *args, &block)
110
- raise Error, "Invalid use of Glimmer keyword #{keyword} with args #{args} under parent #{Glimmer::DSL::Engine.parent}"
114
+ if Glimmer::DSL::Engine.no_dsls?
115
+ puts Glimmer::DSL::Engine::MESSAGE_NO_DSLS
111
116
  else
112
- Glimmer::Config.logger&.debug "#{static_expression.class.name} will handle expression keyword #{keyword}"
113
- return static_expression.interpret(Glimmer::DSL::Engine.parent, keyword, *args, &block).tap do |ui_object|
114
- Glimmer::DSL::Engine.add_content(ui_object, static_expression, &block) unless block.nil?
115
- Glimmer::DSL::Engine.dsl_stack.pop
117
+ retrieved_static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
118
+ static_expression_dsl = (Glimmer::DSL::Engine.static_expressions[keyword].keys - Glimmer::DSL::Engine.disabled_dsls).first if retrieved_static_expression.nil?
119
+ interpretation = nil
120
+ 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))
121
+ begin
122
+ interpretation = Glimmer::DSL::Engine.interpret(keyword, *args, &block)
123
+ rescue => e
124
+ Glimmer::DSL::Engine.reset
125
+ raise e if static_expression_dsl.nil? || !Glimmer::DSL::Engine.static_expressions[keyword][static_expression_dsl].is_a?(TopLevelExpression)
126
+ end
116
127
  end
117
- end
118
- rescue => e
128
+ if interpretation
129
+ interpretation
130
+ else
131
+ raise Glimmer::Error, "Unsupported keyword: #{keyword}" unless static_expression_dsl || retrieved_static_expression
132
+ Glimmer::DSL::Engine.dsl_stack.push(static_expression_dsl || Glimmer::DSL::Engine.dsl)
133
+ static_expression = Glimmer::DSL::Engine.static_expressions[keyword][Glimmer::DSL::Engine.dsl]
134
+ if !static_expression.can_interpret?(Glimmer::DSL::Engine.parent, keyword, *args, &block)
135
+ raise Error, "Invalid use of Glimmer keyword #{keyword} with args #{args} under parent #{Glimmer::DSL::Engine.parent}"
136
+ else
137
+ Glimmer::Config.logger&.debug "#{static_expression.class.name} will handle expression keyword #{keyword}"
138
+ static_expression.interpret(Glimmer::DSL::Engine.parent, keyword, *args, &block).tap do |ui_object|
139
+ Glimmer::DSL::Engine.add_content(ui_object, static_expression, &block) unless block.nil?
140
+ Glimmer::DSL::Engine.dsl_stack.pop
141
+ end
142
+ end
143
+ end
144
+ end
145
+ rescue StandardError => e
119
146
  # Glimmer::DSL::Engine.dsl_stack.pop
120
147
  Glimmer::DSL::Engine.reset
121
148
  raise e
@@ -133,6 +160,10 @@ module Glimmer
133
160
 
134
161
  # Interprets Glimmer dynamic DSL expression consisting of keyword, args, and block (e.g. shell(:no_resize) { ... })
135
162
  def interpret(keyword, *args, &block)
163
+ if no_dsls?
164
+ puts MESSAGE_NO_DSLS
165
+ return
166
+ end
136
167
  keyword = keyword.to_s
137
168
  dynamic_expression_dsl = (dynamic_expression_chains_of_responsibility.keys - disabled_dsls).first if dsl.nil?
138
169
  dsl_stack.push(dynamic_expression_dsl || dsl)
@@ -141,7 +172,7 @@ module Glimmer
141
172
  add_content(ui_object, expression, &block)
142
173
  dsl_stack.pop
143
174
  end
144
- rescue => e
175
+ rescue StandardError => e
145
176
  # dsl_stack.pop
146
177
  reset
147
178
  raise e
@@ -1,6 +1,4 @@
1
1
  require 'glimmer/error'
2
- require 'glimmer/swt/widget_proxy'
3
- require 'glimmer/ui/custom_widget'
4
2
 
5
3
  module Glimmer
6
4
  module DSL
@@ -35,11 +33,6 @@ module Glimmer
35
33
  # No Op by default
36
34
  end
37
35
 
38
- # Checks if parent object is a widget
39
- def widget?(parent)
40
- parent.is_a?(Glimmer::SWT::WidgetProxy) or parent.is_a?(Glimmer::UI::CustomWidget)
41
- end
42
-
43
36
  # Checks if object is a Symbol or a String
44
37
  def textual?(object)
45
38
  object.is_a?(Symbol) or object.is_a?(String)
@@ -1,8 +1,8 @@
1
+ require 'facets/string/underscore'
2
+
1
3
  require 'glimmer/error'
2
4
  require 'glimmer/dsl/engine'
3
5
  require 'glimmer/dsl/expression'
4
- require 'glimmer/swt/widget_proxy'
5
- require 'glimmer/ui/custom_widget'
6
6
 
7
7
  module Glimmer
8
8
  module DSL
@@ -0,0 +1,5 @@
1
+ module Glimmer
2
+ # Represents Glimmer errors that occur due to excluded keywords passing through method_missing
3
+ class ExcludedKeywordError < RuntimeError
4
+ end
5
+ end