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'