rubeus 0.0.1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/swing_ext.rb +295 -0
  2. metadata +45 -0
data/lib/swing_ext.rb ADDED
@@ -0,0 +1,295 @@
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
+
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ extensions: []
3
+ homepage: http://code.google.com/p/rubeus/
4
+ executables: []
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ post_install_message:
8
+ date: 2008-06-20 15:00:00 +00:00
9
+ files:
10
+ - lib/swing_ext.rb
11
+ rubygems_version: 1.1.0
12
+ rdoc_options: []
13
+ signing_key:
14
+ cert_chain: []
15
+ name: rubeus
16
+ has_rdoc: false
17
+ platform: java
18
+ summary: Rubeus provides you an easy access to Java objects from Ruby scripts on JRuby
19
+ default_executable:
20
+ bindir: bin
21
+ required_rubygems_version: !ruby/object:Gem::Requirement
22
+ version:
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: !str 0
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ version:
29
+ requirements:
30
+ - - '>='
31
+ - !ruby/object:Gem::Version
32
+ version: !str 0
33
+ require_paths:
34
+ - lib
35
+ specification_version: 2
36
+ test_files: []
37
+ dependencies: []
38
+ description:
39
+ email: rubeus@googlegroups.com
40
+ authors:
41
+ - Takeshi Akima
42
+ extra_rdoc_files: []
43
+ requirements: []
44
+ rubyforge_project: rubybizcommons
45
+ autorequire: