rubeus 0.0.1-java → 0.0.2-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,51 @@
1
+ module Rubeus::Awt
2
+ module Attributes
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ base.instance_eval do
6
+ alias :new_without_attributes :new
7
+ alias :new :new_with_attributes
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ def new_with_attributes(*args, &block)
13
+ options = args.last.is_a?(Hash) ? args.pop : {}
14
+ result = self.new_without_attributes(*args, &block)
15
+ attributes = ((@class_to_default_attributes || {})[self.java_class.name] || {}).merge(options)
16
+ if respond_to?(:update_attributes)
17
+ update_attributes(result, attributes)
18
+ else
19
+ attributes.each do |attr, value|
20
+ begin
21
+ result.send("#{attr.to_s}=", value)
22
+ rescue
23
+ raise ArgumentError, "Failed setting #{value.inspect} to #{attr.inspect} cause of #{$!.to_s}"
24
+ end
25
+ end
26
+ end
27
+ result
28
+ end
29
+
30
+ def default_attributes(attributes = nil)
31
+ self.default_attributes = attributes if attributes
32
+ result = {}
33
+ @class_to_default_attributes ||= {}
34
+ classes = self.ancestors.select{|klass|
35
+ !klass.java_class.interface? and klass.respond_to?(:default_attributes)}
36
+ classes.reverse.each do |klass|
37
+ if attrs = @class_to_default_attributes[klass.java_class.name]
38
+ result.update(attrs)
39
+ end
40
+ end
41
+ result
42
+ end
43
+
44
+ def default_attributes=(attributes)
45
+ @class_to_default_attributes ||= {}
46
+ @class_to_default_attributes[self.java_class.name] ||= (attributes || {})
47
+ end
48
+
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,133 @@
1
+ module Rubeus::Awt
2
+ module Event
3
+ def self.included(klass)
4
+ klass.extend(ClassMethods)
5
+ end
6
+
7
+ module ClassMethods
8
+ def uncapitalize(str)
9
+ str[0..0].downcase + str[1..-1]
10
+ end
11
+ end
12
+
13
+ def find_java_method(method_name, &block)
14
+ klass = self.java_class
15
+ while klass
16
+ method = klass.declared_instance_methods.detect do |m|
17
+ (m.name == method_name) and (block_given? ? yield(m) : true)
18
+ end
19
+ return method if method
20
+ klass = klass.superclass
21
+ end
22
+ nil
23
+ end
24
+
25
+ def events
26
+ self.event_types.inject({}){|dest, event_type|
27
+ dest[event_type] = event_methods(event_type); dest}
28
+ end
29
+
30
+ def event_types
31
+ self.methods.map{|m| /^add\_(.*?)\_listener$/ =~ m ? $1 : nil }.compact.sort
32
+ end
33
+
34
+ def event_methods(event_type, *methods)
35
+ listener_interface = listener_interface(event_type)
36
+ listener_interface.declared_instance_methods.map{|method|
37
+ method.name.underscore}
38
+ end
39
+
40
+ NULL_METHOD = Proc.new{}
41
+
42
+ private
43
+ def build_hash_comparision(options, option_key, method, inverse, comparision_options = nil)
44
+ comparision_options ||= options[option_key]
45
+ return nil unless comparision_options
46
+ "#{option_key.inspect} option must be a hash" unless comparision_options.is_a?(Hash)
47
+ Proc.new do |event|
48
+ matched = comparision_options.send(method){|key, value| event.send(key) == value}
49
+ inverse ? !matched : matched
50
+ end
51
+ end
52
+
53
+ def build_listener_filters(options)
54
+ filters = []
55
+ [:if, :unless].each do |condition|
56
+ [:any, :all].each do |joiner|
57
+ filters << build_hash_comparision(options,
58
+ "#{condition.to_s}_#{joiner.to_s}".to_sym,
59
+ "#{joiner.to_s}?", condition == :unless)
60
+ end
61
+ end
62
+ if filters.empty?
63
+ filters << build_hash_comparision(options, :if, :all?, false) if options[:if]
64
+ filters << build_hash_comparision(options, :unless, :all?, true) if options[:unless]
65
+ end
66
+ unless filters.empty? and options.empty?
67
+ filters << build_hash_comparision(nil, :if, :all?, false, options)
68
+ end
69
+ filters.compact!
70
+ filters
71
+ end
72
+
73
+ public
74
+ def listen(event_type, *methods, &block)
75
+ options = methods.last.is_a?(Hash) ? methods.pop : {}
76
+ filters = build_listener_filters(options)
77
+ listener_block = filters.empty? ? block :
78
+ Proc.new do |event|
79
+ block.call(event) if filters.all?{|filter| filter.call(event)}
80
+ end
81
+
82
+ listener_interface = listener_interface(event_type)
83
+ lister_methods = listener_interface.declared_instance_methods.map{|method| method.name}
84
+ handling_methods = methods.empty? ?
85
+ lister_methods :
86
+ methods.map{|method| invokable_method(lister_methods, event_type, method)}.compact
87
+ mod = Module.new do
88
+ lister_methods.each do |listener_method|
89
+ if handling_methods.include?(listener_method)
90
+ define_method(listener_method){|*args| listener_block.call(*args)}
91
+ else
92
+ define_method(listener_method, &NULL_METHOD)
93
+ end
94
+ end
95
+ end
96
+ method_name = "add#{event_type.to_s.camelize}Listener"
97
+ listener = Object.new
98
+ listener.extend(mod)
99
+ send(method_name, listener)
100
+ listener
101
+ end
102
+
103
+ private
104
+ def listener_interface(event_type)
105
+ java_event_name = event_type.to_s.camelize
106
+ method_name = "add#{java_event_name}Listener"
107
+ java_method =
108
+ find_java_method(method_name){|m|m.parameter_types.length == 1} ||
109
+ find_java_method(method_name)
110
+ raise "unsupported event '#{java_event_name}' for #{self.class.name}" unless java_method
111
+ if java_method.parameter_types.length != 1
112
+ method_name = "%s(%s)" % [java_method.name, java_method.parameter_types.map{|t|t.name}.join(',')]
113
+ raise "unsupported evnet method #{method_name} for #{java_method.declaring_class.name}"
114
+ end
115
+ java_method.parameter_types.first
116
+ end
117
+
118
+ def invokable_method(java_methods, base_event_type, base_name)
119
+ base_name = base_name.to_s
120
+ return base_name if java_methods.include?(base_name)
121
+ s = self.class.uncapitalize(base_name)
122
+ return s if java_methods.include?(s)
123
+ s = self.class.uncapitalize(base_name.camelize)
124
+ return s if java_methods.include?(s)
125
+ even_type = self.class.uncapitalize(base_event_type.to_s.camelize)
126
+ s = "#{even_type}#{base_name}"
127
+ return s if java_methods.include?(s)
128
+ s = "#{even_type}#{base_name.camelize}"
129
+ return s if java_methods.include?(s)
130
+ return nil
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,14 @@
1
+ Rubeus::Awt.depend_on("Dimension")
2
+
3
+ module Rubeus::Awt::Extensions
4
+ module Component
5
+ def self.included(base)
6
+ base.module_eval do
7
+ include Rubeus::Awt::Attributes
8
+ include Rubeus::Awt::Nestable
9
+ include Rubeus::Awt::Event
10
+ include Rubeus::Awt::Setters
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ Rubeus::Awt.depend_on("Component")
2
+
3
+ module Rubeus::Awt::Extensions
4
+ module Container
5
+ end
6
+ end
@@ -0,0 +1,24 @@
1
+ module Rubeus::Awt::Extensions
2
+ module Dimension
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def create(*args)
9
+ values = args
10
+ if args.length == 1
11
+ if args.first.is_a?(Array)
12
+ return create(*args.first)
13
+ elsif args.first.is_a?(Rubeus::Awt::Dimension)
14
+ return args.first
15
+ else
16
+ values = args.first.to_s.split("x", 2)
17
+ end
18
+ end
19
+ new(*values.map{|s|s.to_i})
20
+ end
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,4 @@
1
+ module Rubeus::Awt
2
+ module Extensions
3
+ end
4
+ end
@@ -0,0 +1,88 @@
1
+ module Rubeus::Awt
2
+ module Nestable
3
+ def self.included(klass)
4
+ klass.extend(ClassMethods)
5
+ klass.instance_eval do
6
+ alias :new_without_nestable :new
7
+ alias :new :new_with_nestable
8
+ end
9
+ end
10
+
11
+ class Context
12
+ def self.container_class_names
13
+ @container_class_names ||= []
14
+ end
15
+
16
+ def self.container_class_names=(*class_names)
17
+ @container_class_names = class_names
18
+ end
19
+
20
+ def self.register_as_container(*class_names)
21
+ self.container_class_names.concat(class_names)
22
+ end
23
+
24
+ def self.add_component_if_container_exist(component, &block)
25
+ @container ||= nil
26
+ @container.send(@action, component) if @container
27
+ end
28
+
29
+ def self.add_new_component_to(container, action = :add, block_argument = nil, &block)
30
+ former_container = @container
31
+ former_action = @action
32
+ @container = container
33
+ @action = action
34
+ begin
35
+ yield(block_argument || container)
36
+ ensure
37
+ @container = former_container
38
+ @action = former_action
39
+ end
40
+ end
41
+
42
+ def self.container
43
+ @container
44
+ end
45
+ end
46
+
47
+
48
+ module ClassMethods
49
+ def new_with_nestable(*args, &block)
50
+ object = self.new_without_nestable(*args)
51
+ Context.add_component_if_container_exist(object)
52
+ return object unless block_given?
53
+ process_block_for_new(object, &block)
54
+ return object
55
+ end
56
+
57
+ def constianer?
58
+ Context.container_class_names.include?(self.java_class.name)
59
+ end
60
+
61
+ def perform_as_container
62
+ Context.container_class_names << self.java_class.name
63
+ end
64
+
65
+ def perform_as_containee
66
+ Context.container_class_names.delete(self.java_class.name)
67
+ end
68
+
69
+ def process_block_for_new(object, &block)
70
+ if self.constianer?
71
+ self.add_new_component_to(object, &block)
72
+ elsif object.respond_to?(:listen)
73
+ object.listen(*self.default_event_type, &block)
74
+ else
75
+ raise "#{self.java_class.name} doesn't support process_block_for_new"
76
+ end
77
+ end
78
+
79
+ def add_new_component_to(object, &block)
80
+ Context.add_new_component_to(object, &block)
81
+ end
82
+
83
+ def default_event_type
84
+ :action
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,26 @@
1
+ Rubeus::Awt.depend_on("Dimension")
2
+
3
+ module Rubeus::Awt
4
+ module Setters
5
+
6
+ def self.included(base)
7
+ base.module_eval do
8
+ alias_method :set_preferred_size_without_rubeus, :set_preferred_size
9
+ alias_method :set_preferred_size, :set_preferred_size_with_rubeus
10
+ alias_method :preferred_size=, :set_preferred_size_with_rubeus
11
+
12
+ alias_method :set_size_without_rubeus, :set_size
13
+ alias_method :set_size, :set_size_with_rubeus
14
+ alias_method :size=, :set_size_with_rubeus
15
+ end
16
+ end
17
+
18
+ def set_preferred_size_with_rubeus(*args)
19
+ set_preferred_size_without_rubeus(Rubeus::Awt::Dimension.create(*args))
20
+ end
21
+
22
+ def set_size_with_rubeus(*args)
23
+ set_size_without_rubeus(Rubeus::Awt::Dimension.create(*args))
24
+ end
25
+ end
26
+ end
data/lib/rubeus/awt.rb ADDED
@@ -0,0 +1,14 @@
1
+ require "rubeus/component_loader"
2
+
3
+ module Rubeus
4
+ extensions_path = File.join(File.dirname(__FILE__), "awt", "extensions")
5
+ Awt = ComponentLoader.new("java.awt", extensions_path) do
6
+ base_path = File.expand_path(File.join(File.dirname(__FILE__), '..'))
7
+ Dir.glob(File.join(base_path, 'rubeus', 'awt', '*.rb')) do |file|
8
+ rel_path = file.gsub("#{base_path}/", '')
9
+ autoload(File.basename(rel_path, '.*').camelize, rel_path.gsub(/\.rb$/, ''))
10
+ end
11
+ end
12
+ end
13
+
14
+ require "rubeus/awt/extensions"
@@ -0,0 +1,103 @@
1
+ module Rubeus
2
+ class ComponentLoader < Module
3
+ attr_reader :java_package, :ruby_module_path, :base_path
4
+
5
+ def self.find_base_path(path)
6
+ path = File.expand_path(path)
7
+ $LOAD_PATH.detect{|load_path| path.include?(File.expand_path(load_path))}
8
+ end
9
+
10
+ def initialize(java_package, ruby_module_path, base_path = nil, &block)
11
+ @java_package, @ruby_module_path, @base_path =
12
+ java_package, ruby_module_path, base_path
13
+ @base_path ||= ComponentLoader.find_base_path(ruby_module_path)
14
+ @ruby_module_holder_name = File.basename(ruby_module_path).camelize
15
+ super(&block)
16
+ end
17
+
18
+ def ruby_module_holder
19
+ @ruby_module_holder ||= (self.const_get(@ruby_module_holder_name) rescue nil)
20
+ unless @ruby_module_holder
21
+ self.const_set(@ruby_module_holder_name, Module.new)
22
+ @ruby_module_holder = self.const_get(@ruby_module_holder_name)
23
+ end
24
+ @ruby_module_holder
25
+ end
26
+
27
+ def extended(object)
28
+ mod = Module.new do
29
+ def const_missing(java_class_name)
30
+ @loader.const_get(java_class_name)
31
+ end
32
+ end
33
+ object.instance_variable_set("@loader", self)
34
+ object.extend(mod)
35
+ end
36
+
37
+ def autolodings
38
+ @autolodings ||= {}
39
+ end
40
+
41
+ def autoload(const_name, feature = nil)
42
+ autolodings[const_name.to_s] = feature ||"#{self.name}::#{java_class_name.to_s}".underscore
43
+ end
44
+
45
+ def autoload?(const_name)
46
+ autolodings[const_name.to_s]
47
+ end
48
+
49
+ def const_missing(java_class_name)
50
+ if autoload?(java_class_name)
51
+ feature = autolodings.delete(java_class_name.to_s)
52
+ require(feature)
53
+ return const_get(java_class_name)
54
+ end
55
+ if java_class_name.to_s == @ruby_module_holder_name.to_s
56
+ raise NameError, java_class_name
57
+ end
58
+ if java_class_name.to_s.include?('::')
59
+ names = java_class_name.to_s.split('::', 2)
60
+ package = names.first
61
+ mod = ComponentLoader.new(
62
+ [@java_package, package.underscore].join('.'),
63
+ File.join(@ruby_module_path, package.underscore),
64
+ @base_path)
65
+ self.const_set(package.camelize, mod)
66
+ mod.const_get(names.last)
67
+ else
68
+ begin
69
+ require(File.join(@ruby_module_path, java_class_name.to_s.underscore))
70
+ rescue LoadError => e
71
+ # puts "warning: #{e}"
72
+ end
73
+ java_fqn = to_java_fqn(java_class_name)
74
+ extension = nil
75
+ begin
76
+ extension = self.ruby_module_holder.const_get(java_class_name)
77
+ rescue
78
+ # puts "warning: #{$!.inspect}"
79
+ end
80
+ if extension
81
+ JavaUtilities.extend_proxy(java_fqn) do
82
+ include extension
83
+ end
84
+ end
85
+ result = instance_eval(java_fqn)
86
+ self.const_set(java_class_name, result)
87
+ result
88
+ end
89
+ rescue
90
+ puts $!
91
+ puts $!.backtrace.join("\n ")
92
+ super
93
+ end
94
+
95
+ def to_java_fqn(java_class_name)
96
+ "#{java_package}.#{java_class_name}"
97
+ end
98
+
99
+ def depend_on(*java_class_names)
100
+ java_class_names.each{|java_class_name| self.const_get(java_class_name)}
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,28 @@
1
+ module Rubeus::Swing::Extensions
2
+ module BoxLayout
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ base.instance_eval do
6
+ alias :new_without_nestable :new
7
+ alias :new :new_with_nestable
8
+ end
9
+ end
10
+
11
+ module ClassMethods
12
+ def new_with_nestable(*args, &block)
13
+ if args.length == 1
14
+ container = Rubeus::Awt::Nestable::Context.container
15
+ raise ArgumentError, "No container! you must specify a Container and an axis" unless container
16
+ args.unshift(container.respond_to?(:content_pane) ? container.content_pane : container)
17
+ end
18
+
19
+ unless args.last.is_a?(Integer)
20
+ value = args.pop
21
+ args << const_get(value.to_s)
22
+ end
23
+
24
+ new_without_nestable(*args, &block)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ module Rubeus::Swing::Extensions
2
+ module JApplet
3
+ def self.included(klass)
4
+ klass.perform_as_container
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ Rubeus::Awt.depend_on("Container")
2
+
3
+ module Rubeus::Swing::Extensions
4
+ module JComponent
5
+
6
+ def self.included(base)
7
+ base.module_eval do
8
+ alias_method :set_preferred_size_without_rubeus, :set_preferred_size
9
+ alias_method :set_preferred_size, :set_preferred_size_with_rubeus
10
+ alias_method :preferred_size=, :set_preferred_size_with_rubeus
11
+ end
12
+ end
13
+
14
+ def set_preferred_size_with_rubeus(*args)
15
+ set_preferred_size_without_rubeus(Rubeus::Awt::Dimension.create(*args))
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ Rubeus::Awt.depend_on('Container', 'Window', 'Frame')
2
+ Rubeus::Swing.depend_on('JPanel')
3
+
4
+ module Rubeus::Swing::Extensions
5
+ module JFrame
6
+ def self.included(base)
7
+ base.perform_as_container
8
+ base.default_attributes = {
9
+ :size => [400, 300],
10
+ :default_close_operation => javax.swing.JFrame::EXIT_ON_CLOSE
11
+ }
12
+ if ENV_JAVA["java.specification.version"] == "1.6"
13
+ base.module_eval do
14
+ alias_method :set_size_without_rubeus, :set_size
15
+ alias_method :set_size, :set_size_with_rubeus
16
+ alias_method :size=, :set_size_with_rubeus
17
+ end
18
+ end
19
+ end
20
+
21
+ if ENV_JAVA["java.specification.version"] == "1.6"
22
+ def set_size_with_rubeus(*args)
23
+ set_size_without_rubeus(Rubeus::Awt::Dimension.create(*args))
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ Rubeus::Swing.depend_on("JComponent")
2
+
3
+ module Rubeus::Swing::Extensions
4
+ module JPanel
5
+ def self.included(base)
6
+ base.perform_as_container
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ JavaUtilities.extend_proxy('javax.swing.JScrollPane') do
2
+ perform_as_container
3
+
4
+ def self.add_new_component_to(object, &block)
5
+ Rubeus::Awt::Nestable::Context.add_new_component_to(object.viewport, :set_view, object, &block)
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ JavaUtilities.extend_proxy('javax.swing.JSplitPane') do
2
+ perform_as_container
3
+
4
+ def self.add_new_component_to(object, &block)
5
+ Rubeus::Awt::Nestable::Context.add_new_component_to(object, :append_component, &block)
6
+ end
7
+
8
+ def append_component(component)
9
+ append_method =
10
+ (self.orientation == javax.swing.JSplitPane::VERTICAL_SPLIT) ?
11
+ (top_component ? :set_bottom_component : :set_top_component) :
12
+ (left_component ? :set_right_component : :set_left_component)
13
+ send(append_method, component)
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ JavaUtilities.extend_proxy("javax.swing.JTextField") do
2
+ def self.default_event_type
3
+ return :key, :pressed
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ JavaUtilities.extend_proxy('javax.swing.JWindow') do
2
+ perform_as_container
3
+ end
@@ -0,0 +1,4 @@
1
+ module Rubeus::Swing
2
+ module Extensions
3
+ end
4
+ end
@@ -0,0 +1,42 @@
1
+ require "rubeus/component_loader"
2
+
3
+ module Rubeus
4
+ extensions_path = File.join(File.dirname(__FILE__), "swing", "extensions")
5
+ Swing = ComponentLoader.new("javax.swing", extensions_path) do
6
+
7
+ def self.irb
8
+ Object.send(:extend, self)
9
+ end
10
+ end
11
+ end
12
+
13
+ require "rubeus/swing/extensions"
14
+
15
+ require "rubeus/awt/attributes"
16
+ require "rubeus/awt/nestable"
17
+ require "rubeus/awt/event"
18
+
19
+
20
+ =begin
21
+ import "javax.swing.JFrame"
22
+
23
+ require "swing_ext"
24
+
25
+ frame = JFrame.new("JDBC Query")
26
+ frame.set_size(400, 300)
27
+ frame.default_close_operation = JFrame::EXIT_ON_CLOSE
28
+ frame.events
29
+ frame.event_methods(:key)
30
+ frame.event_methods(:key, :typed)
31
+ frame.event_methods(:key, "typed")
32
+ frame.event_methods(:key, :keyTyped)
33
+ frame.event_methods(:key, :keyTyped)
34
+ frame.event_methods(:key, "key_typed")
35
+ frame.event_methods(:key, "key_Typed")
36
+
37
+ frame.events.each
38
+
39
+ frame.visible = true
40
+
41
+ =end
42
+
data/lib/rubeus.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "rubygems"
2
+ gem "activesupport", ">=2.0.2"
3
+ # require "active_support"
4
+ require "active_support/core_ext/string"
5
+
6
+ module Rubeus
7
+ VERSION = "0.0.2"
8
+ autoload :Awt, "rubeus/awt"
9
+ autoload :Swing, "rubeus/swing"
10
+ end
metadata CHANGED
@@ -3,12 +3,38 @@ extensions: []
3
3
  homepage: http://code.google.com/p/rubeus/
4
4
  executables: []
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.1
6
+ version: 0.0.2
7
7
  post_install_message:
8
- date: 2008-06-20 15:00:00 +00:00
8
+ date: 2008-06-28 15:00:00 +00:00
9
9
  files:
10
- - lib/swing_ext.rb
11
- rubygems_version: 1.1.0
10
+ - lib/rubeus
11
+ - lib/rubeus.rb
12
+ - lib/rubeus/awt
13
+ - lib/rubeus/awt.rb
14
+ - lib/rubeus/component_loader.rb
15
+ - lib/rubeus/swing
16
+ - lib/rubeus/swing.rb
17
+ - lib/rubeus/awt/attributes.rb
18
+ - lib/rubeus/awt/event.rb
19
+ - lib/rubeus/awt/extensions
20
+ - lib/rubeus/awt/extensions.rb
21
+ - lib/rubeus/awt/nestable.rb
22
+ - lib/rubeus/awt/setters.rb
23
+ - lib/rubeus/awt/extensions/component.rb
24
+ - lib/rubeus/awt/extensions/container.rb
25
+ - lib/rubeus/awt/extensions/dimension.rb
26
+ - lib/rubeus/swing/extensions
27
+ - lib/rubeus/swing/extensions.rb
28
+ - lib/rubeus/swing/extensions/box_layout.rb
29
+ - lib/rubeus/swing/extensions/j_applet.rb
30
+ - lib/rubeus/swing/extensions/j_component.rb
31
+ - lib/rubeus/swing/extensions/j_frame.rb
32
+ - lib/rubeus/swing/extensions/j_panel.rb
33
+ - lib/rubeus/swing/extensions/j_scroll_pane.rb
34
+ - lib/rubeus/swing/extensions/j_split_pane.rb
35
+ - lib/rubeus/swing/extensions/j_text_field.rb
36
+ - lib/rubeus/swing/extensions/j_window.rb
37
+ rubygems_version: 1.1.1
12
38
  rdoc_options: []
13
39
  signing_key:
14
40
  cert_chain: []
@@ -34,7 +60,16 @@ require_paths:
34
60
  - lib
35
61
  specification_version: 2
36
62
  test_files: []
37
- dependencies: []
63
+ dependencies:
64
+ - !ruby/object:Gem::Dependency
65
+ name: activesupport
66
+ version_requirement:
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ version:
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 2.0.2
38
73
  description:
39
74
  email: rubeus@googlegroups.com
40
75
  authors:
data/lib/swing_ext.rb DELETED
@@ -1,295 +0,0 @@
1
- class << java.swing
2
- def container_class_names
3
- @container_class_names ||= []
4
- end
5
-
6
- def container_class_names=(*class_names)
7
- @container_class_names = class_names
8
- end
9
-
10
- def register_as_container(*class_names)
11
- self.container_class_names.concat(class_names)
12
- end
13
-
14
- def add_component_if_container_exist(component, &block)
15
- @container ||= nil
16
- @container.send(@action, component) if @container
17
- end
18
-
19
- def add_new_component_to(container, action = :add, block_argument = nil, &block)
20
- former_container = @container
21
- former_action = @action
22
- @container = container
23
- @action = action
24
- begin
25
- yield(block_argument || container)
26
- ensure
27
- @container = former_container
28
- @action = former_action
29
- end
30
- end
31
- end
32
-
33
-
34
- java.swing.register_as_container(
35
- 'javax.swing.JApplet',
36
- 'javax.swing.JFrame',
37
- 'javax.swing.JPanel',
38
- 'javax.swing.JScrollPane',
39
- 'javax.swing.JSplitPane',
40
- 'javax.swing.JWindow'
41
- )
42
-
43
- JavaUtilities.extend_proxy('javax.swing.JComponent') do
44
- def set_preferred_size_with_rubeus(*args)
45
- values = args
46
- if args.length == 1
47
- if args.first.is_a?(java.awt.Dimension)
48
- return set_preferred_size_without_rubeus(*args)
49
- else
50
- values = args.first.to_s.split("x", 2)
51
- end
52
- end
53
- set_preferred_size_without_rubeus(java.awt.Dimension.new(*values.map{|s|s.to_i}))
54
- end
55
-
56
- alias_method :set_preferred_size_without_rubeus, :set_preferred_size
57
- alias_method :set_preferred_size, :set_preferred_size_with_rubeus
58
- end
59
-
60
-
61
- JavaUtilities.extend_proxy('java.awt.Component') do
62
- def self.new_with_nestable(*args, &block)
63
- object = self.new_without_nestable(*args)
64
- java.swing.add_component_if_container_exist(object)
65
- return object unless block_given?
66
- initial_nest(object, &block)
67
- return object
68
- end
69
-
70
- self.instance_eval do
71
- alias :new_without_nestable :new
72
- alias :new :new_with_nestable
73
- end
74
-
75
- def self.constianer?
76
- java.swing.container_class_names.include?(self.java_class.name)
77
- end
78
-
79
- def self.perform_as_container
80
- @as_container = true
81
- end
82
-
83
- def self.perform_as_containee
84
- @as_container = false
85
- end
86
-
87
- def self.initial_nest(object, &block)
88
- if self.constianer?
89
- self.add_new_component_to(object, &block)
90
- elsif object.respond_to?(:listen)
91
- object.listen(*self.default_event_type, &block)
92
- else
93
- raise "#{self.java_class.name} doesn't support initial_nest"
94
- end
95
- end
96
-
97
- def self.add_new_component_to(object, &block)
98
- java.swing.add_new_component_to(object, &block)
99
- end
100
-
101
- def self.default_event_type
102
- :action
103
- end
104
-
105
- def self.camelize(str)
106
- parts = str.to_s.split('_')
107
- parts.map{|part| part[0..0].upcase + part[1..-1].downcase}.join
108
- end
109
-
110
- def self.underscore(camel_cased_word)
111
- camel_cased_word.to_s.gsub(/::/, '/').
112
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
113
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
114
- tr("-", "_").
115
- downcase
116
- end
117
-
118
- def self.uncapitalize(str)
119
- str[0..0].downcase + str[1..-1]
120
- end
121
-
122
- def find_java_method(method_name, &block)
123
- klass = self.java_class
124
- while klass
125
- method = klass.declared_instance_methods.detect do |m|
126
- (m.name == method_name) and (block_given? ? yield(m) : true)
127
- end
128
- return method if method
129
- klass = klass.superclass
130
- end
131
- nil
132
- end
133
-
134
- def events
135
- self.event_types.inject({}){|dest, event_type|
136
- dest[event_type] = event_methods(event_type); dest}
137
- end
138
-
139
- def event_types
140
- self.methods.map{|m| /^add\_(.*?)\_listener$/ =~ m ? $1 : nil }.compact.sort
141
- end
142
-
143
- def event_methods(event_type, *methods)
144
- listener_interface = listener_interface(event_type)
145
- listener_interface.declared_instance_methods.map{|method|
146
- self.class.underscore(method.name)}
147
- end
148
-
149
- NULL_METHOD = Proc.new{}
150
-
151
- private
152
- def build_hash_comparision(options, option_key, method, inverse, comparision_options = nil)
153
- comparision_options ||= options[option_key]
154
- return nil unless comparision_options
155
- "#{option_key.inspect} option must be a hash" unless comparision_options.is_a?(Hash)
156
- Proc.new do |event|
157
- matched = comparision_options.send(method){|key, value| event.send(key) == value}
158
- inverse ? !matched : matched
159
- end
160
- end
161
-
162
- def build_listener_filters(options)
163
- filters = []
164
- [:if, :unless].each do |condition|
165
- [:any, :all].each do |joiner|
166
- filters << build_hash_comparision(options,
167
- "#{condition.to_s}_#{joiner.to_s}".to_sym,
168
- "#{joiner.to_s}?", condition == :unless)
169
- end
170
- end
171
- if filters.empty?
172
- filters << build_hash_comparision(options, :if, :all?, false) if options[:if]
173
- filters << build_hash_comparision(options, :unless, :all?, true) if options[:unless]
174
- end
175
- unless filters.empty? and options.empty?
176
- filters << build_hash_comparision(nil, :if, :all?, false, options)
177
- end
178
- filters.compact!
179
- filters
180
- end
181
-
182
- public
183
- def listen(event_type, *methods, &block)
184
- options = methods.last.is_a?(Hash) ? methods.pop : {}
185
- filters = build_listener_filters(options)
186
- listener_block = filters.empty? ? block :
187
- Proc.new do |event|
188
- block.call(event) if filters.all?{|filter| filter.call(event)}
189
- end
190
-
191
- listener_interface = listener_interface(event_type)
192
- lister_methods = listener_interface.declared_instance_methods.map{|method| method.name}
193
- handling_methods = methods.empty? ?
194
- lister_methods :
195
- methods.map{|method| invokable_method(lister_methods, event_type, method)}.compact
196
- mod = Module.new do
197
- lister_methods.each do |listener_method|
198
- if handling_methods.include?(listener_method)
199
- define_method(listener_method){|*args| listener_block.call(*args)}
200
- else
201
- define_method(listener_method, &NULL_METHOD)
202
- end
203
- end
204
- end
205
- method_name = "add#{self.class.camelize(event_type)}Listener"
206
- listener = Object.new
207
- listener.extend(mod)
208
- send(method_name, listener)
209
- listener
210
- end
211
-
212
- private
213
- def listener_interface(event_type)
214
- java_event_name = self.class.camelize(event_type)
215
- method_name = "add#{java_event_name}Listener"
216
- java_method =
217
- find_java_method(method_name){|m|m.parameter_types.length == 1} ||
218
- find_java_method(method_name)
219
- raise "unsupported event '#{java_event_name}' for #{self.class.name}" unless java_method
220
- if java_method.parameter_types.length != 1
221
- method_name = "%s(%s)" % [java_method.name, java_method.parameter_types.map{|t|t.name}.join(',')]
222
- raise "unsupported evnet method #{method_name} for #{java_method.declaring_class.name}"
223
- end
224
- java_method.parameter_types.first
225
- end
226
-
227
- def invokable_method(java_methods, base_event_type, base_name)
228
- base_name = base_name.to_s
229
- return base_name if java_methods.include?(base_name)
230
- s = self.class.uncapitalize(base_name)
231
- return s if java_methods.include?(s)
232
- s = self.class.uncapitalize(self.class.camelize(base_name))
233
- return s if java_methods.include?(s)
234
- even_type = self.class.uncapitalize(self.class.camelize(base_event_type))
235
- s = "#{even_type}#{base_name}"
236
- return s if java_methods.include?(s)
237
- camelized = self.class.camelize(base_name)
238
- s = "#{even_type}#{camelized}"
239
- return s if java_methods.include?(s)
240
- return nil
241
- end
242
- end
243
-
244
- JavaUtilities.extend_proxy("javax.swing.JTextField") do
245
- def self.default_event_type
246
- return :key, :pressed
247
- end
248
- end
249
-
250
- JavaUtilities.extend_proxy('javax.swing.JScrollPane') do
251
- def self.add_new_component_to(object, &block)
252
- java.swing.add_new_component_to(object.viewport, :set_view, object, &block)
253
- end
254
- end
255
-
256
- JavaUtilities.extend_proxy('javax.swing.JSplitPane') do
257
- def self.add_new_component_to(object, &block)
258
- java.swing.add_new_component_to(object, :append_component, &block)
259
- end
260
-
261
- def append_component(component)
262
- append_method =
263
- (self.orientation == javax.swing.JSplitPane::VERTICAL_SPLIT) ?
264
- (top_component ? :set_bottom_component : :set_top_component) :
265
- (left_component ? :set_right_component : :set_left_component)
266
- send(append_method, component)
267
- end
268
-
269
- end
270
-
271
-
272
-
273
- =begin
274
- import "javax.swing.JFrame"
275
-
276
- require "swing_ext"
277
-
278
- frame = JFrame.new("JDBC Query")
279
- frame.set_size(400, 300)
280
- frame.default_close_operation = JFrame::EXIT_ON_CLOSE
281
- frame.events
282
- frame.event_methods(:key)
283
- frame.event_methods(:key, :typed)
284
- frame.event_methods(:key, "typed")
285
- frame.event_methods(:key, :keyTyped)
286
- frame.event_methods(:key, :keyTyped)
287
- frame.event_methods(:key, "key_typed")
288
- frame.event_methods(:key, "key_Typed")
289
-
290
- frame.events.each
291
-
292
- frame.visible = true
293
-
294
- =end
295
-