class Glimmer::JFX::ControlProxy

Proxy for JavaFX control objects

Follows the Proxy Design Pattern

Attributes

args[R]
block[R]
jfx[R]
keyword[R]
parent_proxy[R]

Public Class Methods

control_class(keyword) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 73
def control_class(keyword)
  unless flyweight_control_class[keyword]
    begin
      control_class_name = control_class_symbol(keyword).to_s
      control_class = eval(control_class_name)
      unless control_class.ancestors.include?(Java::JavafxScene::Node)
        control_class = control_class_manual_entries[keyword]
        if control_class.nil?
          Glimmer::Config.logger.debug {"Class #{control_class} matching #{keyword} is not a subclass of javafx.scene.Node"}
          return nil
        end
      end
      flyweight_control_class[keyword] = control_class
    rescue SyntaxError, NameError => e
      Glimmer::Config.logger.debug {e.full_message}
      nil
    rescue => e
      Glimmer::Config.logger.debug {e.full_message}
      nil
    end
  end
  flyweight_control_class[keyword]
end
control_class_manual_entries() click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 65
def control_class_manual_entries
  # add mappings for any classes (minus the namespace) that conflict with standard Ruby classes
  {
    # example:
    # 'date_time' => Java::OrgEclipseSwtWidgets::DateTime
  }
end
control_class_symbol(keyword) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 57
def control_class_symbol(keyword)
  keyword.camelcase(:upper).to_sym
end
control_proxy_class(keyword) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 43
def control_proxy_class(keyword)
  begin
    class_name = control_proxy_class_symbol(keyword)
    Glimmer::JFX::ControlProxy.const_get(class_name)
  rescue => e
    Glimmer::Config.logger.debug e.full_message
    Glimmer::JFX::ControlProxy
  end
end
control_proxy_class_symbol(keyword) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 53
def control_proxy_class_symbol(keyword)
  "#{keyword.camelcase(:upper)}Proxy".to_sym
end
create(parent, keyword, *args, &block) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 39
def create(parent, keyword, *args, &block)
  control_proxy_class(keyword).new(parent, keyword, *args, &block)
end
exist?(keyword) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 35
def exist?(keyword)
  !!control_class(keyword)
end
flyweight_control_class() click to toggle source

Flyweight Design Pattern memoization cache. Can be cleared if memory is needed.

# File lib/glimmer/jfx/control_proxy.rb, line 98
def flyweight_control_class
  @flyweight_control_class ||= {}
end
keyword(control_proxy_class) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 61
def keyword(control_proxy_class)
  control_proxy_class.to_s.underscore.sub(/_proxy$/, '')
end
new(parent, keyword, *args, &block) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 105
def initialize(parent, keyword, *args, &block)
  @parent_proxy = parent
  @keyword = keyword
  @args = args
  @block = block
  build
  post_add_content if @block.nil?
end

Public Instance Methods

content(&block) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 149
def content(&block)
  Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::JFX::ControlExpression.new, @keyword, &block)
end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/glimmer/jfx/control_proxy.rb, line 137
def method_missing(method_name, *args, &block)
  if respond_to?("#{method_name}=", true) && !args.empty?
    send("#{method_name}=", *args)
  elsif @jfx.respond_to?("set_#{method_name}", true) && !args.empty?
    send_to_jfx("set_#{method_name}", *args, &block)
  elsif @jfx.respond_to?(method_name, true)
    send_to_jfx(method_name, *args, &block)
  else
    super
  end
end
post_add_content() click to toggle source

Subclasses may override to perform post add_content work (normally must call super)

# File lib/glimmer/jfx/control_proxy.rb, line 115
def post_add_content
  @parent_proxy&.post_initialize_child(self)
end
post_initialize_child(child) click to toggle source

Subclasses may override to perform post initialization work on an added child (normally must also call super)

# File lib/glimmer/jfx/control_proxy.rb, line 120
def post_initialize_child(child)
  children.add(child.jfx) if respond_to?(:children) && child.is_a?(ControlProxy)
end
respond_to?(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/glimmer/jfx/control_proxy.rb, line 124
def respond_to?(method_name, *args, &block)
  respond_to_jfx?(method_name, *args, &block) ||
    super(method_name, true)
end
respond_to_jfx?(method_name, *args, &block) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 129
def respond_to_jfx?(method_name, *args, &block)
  @jfx.respond_to?(method_name, true) || @jfx.respond_to?("set_#{method_name}", true)
end
send_to_jfx(method_name, *args, &block) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 133
def send_to_jfx(method_name, *args, &block)
  @jfx.send(method_name, *normalize_args(args), &block)
end

Private Instance Methods

build() click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 155
def build
  @jfx = ControlProxy.control_class(keyword).new(*normalize_args(args))
end
normalize_args(args) click to toggle source
# File lib/glimmer/jfx/control_proxy.rb, line 159
def normalize_args(args)
  args.map do |arg|
    arg.is_a?(ControlProxy) ? arg.jfx : arg
  end
end