lib/glimmer.rb in glimmer-0.4.9 vs lib/glimmer.rb in glimmer-0.5.0
- old
+ new
@@ -1,82 +1,73 @@
# Glimmer - a JRuby DSL that enables easy and efficient authoring of user
# interfaces using the robust platform-independent Eclipse SWT library. Glimmer
# comes with built-in data-binding support to greatly facilitate synchronizing
# UI with domain models.
-require "rubygems"
-require "facets"
-require "super_module"
-require "logger"
-require "java"
-require "nested_inherited_jruby_include_package"
-require_relative "glimmer/parent"
-require_relative "glimmer/swt_packages" #TODO move into SWT namespace
-require_relative "glimmer/swt/custom_widget"
-require_relative 'glimmer/swt/video' # TODO offload to a custom widget directory
-require_relative "glimmer/ext/module"
+require 'facets'
+require 'super_module'
+require 'logger'
+require 'java'
+require 'set'
+require 'nested_inherited_jruby_include_package'
+# Glimmer provides a JRuby Desktop UI DSL + Data-Binding functionality
+#
+# A desktop UI application class must include Glimmer to gain access to Glimmer DSL
+#
+# Glimmer DSL static keywords (e.g. rgb, bind, etc..) are available as inherited methods
+# Glimmer DSL dynamic keywords (e.g. label, combo, etc...) are available via method_missing
module Glimmer
+ #TODO make it configurable to include or not include perhaps reverting to using included
REGEX_METHODS_EXCLUDED = /^(to_|\[)/
- #TODO make it configurable to include or not include
- include SwtPackages
- def self.included(klass)
- klass.include SwtPackages
- end
- def self.extended(klass)
- klass.include SwtPackages
- end
- @@parent_stack = []
- @@logger = Logger.new(STDOUT).tap {|logger| logger.level = Logger::WARN}
+ class << self
+ def included(klass)
+ if import_swt_packages
+ klass.include(SWT::Packages)
+ end
+ end
- def self.logger
- @@logger
- end
+ # Tells Glimmer to import SWT packages into including class (default: true)
+ def import_swt_packages=(value)
+ @@import_swt_packages = !!value
+ end
- # TODO calling original method_missing after aliasing for cases where method_missing is not needed, like known excluded symbols
+ # Returns whether Glimmer will import SWT packages into including class
+ def import_swt_packages
+ unless defined? @@import_swt_packages
+ @@import_swt_packages = true
+ end
+ @@import_swt_packages
+ end
- alias method_missing_without_glimmer method_missing
- def self.method_missing(method_symbol, *args, &block)
- if method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
- return method_missing_without_glimmer(method_symbol, *args, &block)
+ # Returns Glimmer logger (standard Ruby logger)
+ def logger
+ unless defined? @@logger
+ @@logger = Logger.new(STDOUT).tap {|logger| logger.level = Logger::WARN}
+ end
+ @@logger
end
- Glimmer.logger.debug "method: " + method_symbol.to_s + " and args: " + args.to_s
- command_handler_chain = CommandHandlerChainFactory.chain
- return_value = command_handler_chain.handle(@@parent_stack.last, method_symbol, *args, &block)
- add_contents(return_value, &block)
- return return_value
- # rescue => e
- # Glimmer.logger.error e.message
- # method_missing_without_glimmer(method_symbol, *args, &block)
end
- # TODO come up with a better public name for this and put on gwidgets directly
- def self.add_contents(parent, &block)
- @@parent_stack.push(parent) if parent.is_a?(Parent)
- @@parent_stack.last.process_block(block) if block and @@parent_stack.last
- @@parent_stack.pop if parent.is_a?(Parent)
- end
-
- def self.dsl(dsl)
- @@parent_stack = []
- CommandHandlerChainFactory.select_dsl(dsl)
- end
-
- #added for convenience
-
def method_missing(method_symbol, *args, &block)
- Glimmer.method_missing(method_symbol, *args, &block)
+ # This if statement speeds up Glimmer in girb or whenever directly including on main object
+ if method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
+ raise InvalidKeywordError, "Glimmer excluded keyword: #{method_symbol}"
+ end
+ Glimmer.logger.debug "keyword: " + method_symbol.to_s + " and args: " + args.to_s
+ Glimmer::DSL::Engine.interpret(method_symbol, *args, &block)
+ rescue InvalidKeywordError => e
+ if !method_symbol.to_s.match(REGEX_METHODS_EXCLUDED)
+ Glimmer.logger.error e.message
+ end
+ Glimmer.logger.debug "#{e.message}\n#{e.backtrace.join("\n")}"
+ super(method_symbol, *args, &block)
end
-
- def add_contents(parent, &block)
- Glimmer.add_contents(parent, &block)
- end
-
- def dsl(dsl)
- Glimmer.dsl(dsl)
- end
end
-# Command handlers may rely on Glimmer, so this is put here to avoid an infinite loop.
-require File.dirname(__FILE__) + "/glimmer/xml_command_handlers" #TODO move into namespace
-require File.dirname(__FILE__) + "/glimmer/command_handlers" #TODO move into namespace
+$LOAD_PATH.unshift(File.expand_path('..', __FILE__))
+
+require 'glimmer/swt/packages'
+require 'glimmer/dsl'
+require 'glimmer/error'
+require 'glimmer/invalid_keyword_error'