cheri 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README +387 -15
- data/lib/cheri/awt.rb +4 -2
- data/lib/cheri/builder.rb +1 -0
- data/lib/cheri/builder/awt/main.rb +1 -1
- data/lib/cheri/builder/base.rb +1 -321
- data/lib/cheri/builder/config.rb +6 -2
- data/lib/cheri/builder/context.rb +103 -26
- data/lib/cheri/builder/generator.rb +38 -32
- data/lib/cheri/builder/html/element.rb +106 -16
- data/lib/cheri/builder/html/main.rb +125 -19
- data/lib/cheri/builder/html/types.rb +12 -2
- data/lib/cheri/builder/main.rb +200 -7
- data/lib/cheri/builder/markup.rb +608 -0
- data/lib/cheri/builder/swing/main.rb +2 -2
- data/lib/cheri/builder/xml/connecter.rb +11 -0
- data/lib/cheri/builder/xml/element.rb +141 -22
- data/lib/cheri/builder/xml/main.rb +188 -32
- data/lib/cheri/builder/xml/types.rb +5 -0
- data/lib/cheri/cheri.rb +1 -1
- data/lib/cheri/explorer.rb +4 -2
- data/lib/cheri/explorer/explorer.rb +4 -2
- data/lib/cheri/java/builder/main.rb +32 -11
- data/lib/cheri/jruby.rb +4 -2
- data/lib/cheri/jruby/explorer.rb +4 -2
- data/lib/cheri/swing.rb +4 -2
- metadata +3 -2
data/README
CHANGED
@@ -6,21 +6,394 @@ based on the framework, as well as a builder-builder tool for easily creating
|
|
6
6
|
simple builders. Cheri also comes with a demo application, Cheri::JRuby::Explorer,
|
7
7
|
that is built using two of the supplied builders (Cheri::Swing and Cheri::Html).
|
8
8
|
|
9
|
-
This version (0.0.
|
10
|
-
developed
|
11
|
-
which is
|
12
|
-
|
9
|
+
This version (0.0.6) is an early beta release. Some features are still not fully
|
10
|
+
developed (though we're getting close). So do expect some bugs, especially in
|
11
|
+
Cheri::JRuby::Explorer (CJX), which is very much a work in progress. I note some
|
12
|
+
known problems in the CJX section below.
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Documentation will be forthcoming over the next couple of days (from this writing,
|
18
|
-
8 June 2007), so watch the Cheri websites at RubyForge for updates:
|
14
|
+
Documentation will be forthcoming over the coming days, so watch the Cheri pages
|
15
|
+
at RubyForge for updates:
|
19
16
|
|
20
17
|
http://cheri.rubyforge.org/
|
21
18
|
http://rubyforge.org/projects/cheri
|
22
19
|
|
23
|
-
|
20
|
+
|
21
|
+
== Quick Start
|
22
|
+
|
23
|
+
Cheri builders are mixin modules; to use one, you include it in a class. The builder's
|
24
|
+
functionality is available to instances of that class, and any subclasses (unless the
|
25
|
+
including class is Object � inclusion in Object / at the top level is supported, but
|
26
|
+
discouraged; inheritance is disabled in that case).
|
27
|
+
|
28
|
+
require 'rubygems'
|
29
|
+
require 'cheri/swing'
|
30
|
+
...
|
31
|
+
include Cheri::Swing
|
32
|
+
|
33
|
+
All Cheri builders implement a +cheri+ method (the _proxy_ method), which plays two roles,
|
34
|
+
depending on how it's called. When called with a block, the cheri method enables Cheri
|
35
|
+
builder syntax within its scope for all included builders. When called without a block,
|
36
|
+
it returns a CheriProxy object that can act as a receiver for builder methods, for any
|
37
|
+
included builder.
|
38
|
+
|
39
|
+
@frame = cheri.frame('Hello!') #=> JFrame (for Cheri::Swing)
|
40
|
+
|
41
|
+
cheri {
|
42
|
+
@frame = frame('Hello!')
|
43
|
+
}
|
44
|
+
|
45
|
+
The +cheri+ method is also used to set global Cheri options. Currently only one
|
46
|
+
global option, +alias+, is defined:
|
47
|
+
|
48
|
+
cheri[:alias=>[:cbox,:check_box,:tnode,:default_mutable_tree_node]]
|
49
|
+
|
50
|
+
cheri.cbox #=> JCheckBox (Cheri::Swing)
|
51
|
+
cheri.tnode #=> DefaultMutableTreeNode (Cheri::Swing)
|
52
|
+
|
53
|
+
Each built-in Cheri builder also supplies its own proxy method (in addition to the +cheri+
|
54
|
+
method): +swing+ for Cheri::Swing (and also +awt+, since Cheri::Swing includes Cheri::AWT),
|
55
|
+
+html+ for Cheri::Html, and +xml+ for Cheri::Xml. These methods play the same dual
|
56
|
+
scoping/proxy roles as the +cheri+ method, but apply only to their respective builders.
|
57
|
+
(Each also provides additional functionality; see the sections on individual builders for details.)
|
58
|
+
The builder-specific proxy methods also serve to disambiguate overloaded builder method names:
|
59
|
+
|
60
|
+
swing.frame #=> javax.swing.JFrame
|
61
|
+
awt.frame #=> java.awt.Frame
|
62
|
+
html.frame #=> HTML frame (Cheri::Html::EmptyElem)
|
63
|
+
|
64
|
+
=== Cheri::Swing
|
65
|
+
|
66
|
+
To include:
|
67
|
+
|
68
|
+
require 'rubygems'
|
69
|
+
require 'cheri/swing'
|
70
|
+
...
|
71
|
+
include Cheri::Swing
|
72
|
+
|
73
|
+
Note that inclusion at the top level is not recommended.
|
74
|
+
|
75
|
+
Options:
|
76
|
+
|
77
|
+
swing[:auto]
|
78
|
+
swing[:auto=>true] #=> Enables auto mode (no swing/cheri block required)
|
79
|
+
|
80
|
+
Cheri::Swing (which includes Cheri::AWT) includes methods (Ruby-cased class names)
|
81
|
+
for all javax.swing, javax.swing.border and java.awt classes, plus many in javax.swing.table,
|
82
|
+
javax.swing.tree, java.awt.image and java.awt.geom. You can extend Cheri::Swing with other
|
83
|
+
classes/packages (including 3rd party, or your own!) using the Cheri builder-builder's
|
84
|
+
+build_package+ method.
|
85
|
+
|
86
|
+
Cheri::Swing (and any other builder based on Cheri::Java) also provides easy-to-use
|
87
|
+
on_xxx methods to implement event listeners. Any event listener supported by a class
|
88
|
+
(through an addXxxListener method) can be accessed from Cheri::Swing using an on_xxx method
|
89
|
+
(where xxx is the Ruby-cased event-method name). Because it is so widely used in Swing,
|
90
|
+
the ActionListener#actionPerformed event method is aliased as on_click:
|
91
|
+
|
92
|
+
@frame = swing.frame('Hello') {
|
93
|
+
size 500,500
|
94
|
+
flow_layout
|
95
|
+
on_window_closing {|event| @frame.dispose}
|
96
|
+
button('Hit me') {
|
97
|
+
on_click { puts 'button clicked' }
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
The +cherify+ and +cheri_yield+ methods can be used to incorporate objects created
|
102
|
+
outside the Cheri::Swing framework (+cherify+), or to re-introduce objects created
|
103
|
+
earlier within the framework (+cheri_yield+):
|
104
|
+
|
105
|
+
class MyButton < javax.swing.JButton
|
106
|
+
...
|
107
|
+
end
|
108
|
+
...
|
109
|
+
a_button = MyButton.new
|
110
|
+
...
|
111
|
+
@frame = swing.frame('Hello') {
|
112
|
+
size 500,500
|
113
|
+
flow_layout
|
114
|
+
cherify(a_button) {
|
115
|
+
on_click { puts 'button clicked' }
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
@frame = swing.frame('Hello') {
|
120
|
+
menu_bar {
|
121
|
+
@file_menu = menu('File') {
|
122
|
+
menu_item('Exit') {on_click {@frame.dispose } }
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
# => add a new item later:
|
127
|
+
cheri_yield(@file_menu) {
|
128
|
+
menu_item('Open...') {
|
129
|
+
on_click { ... }
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
The Cheri builder-builder can be used to extend Cheri::Swing in a couple of ways.
|
134
|
+
Individual classes can be included using the +build+ statement, while entire
|
135
|
+
packages can be included using the +build_package+ statement. Note that you may
|
136
|
+
need to supply connection logic if the incorporated classes use methods other
|
137
|
+
than +add+ to connect child objects to parent objects; see file
|
138
|
+
/lib/cheri/builder/swing/connecter.rb for many examples.
|
139
|
+
|
140
|
+
// Java:
|
141
|
+
package my.pkg;
|
142
|
+
public class MyParent extends javax.swing.JComponent {
|
143
|
+
...
|
144
|
+
public void addChild(MyChild child) {
|
145
|
+
...
|
146
|
+
}
|
147
|
+
}
|
148
|
+
...
|
149
|
+
public class MyChild {
|
150
|
+
...
|
151
|
+
}
|
152
|
+
|
153
|
+
# JRuby:
|
154
|
+
require 'cheri/swing'
|
155
|
+
...
|
156
|
+
include Cheri::Swing
|
157
|
+
...
|
158
|
+
# easy-to-reference names; could use include_package instead
|
159
|
+
MyParent = Java::my.pkg.MyParent
|
160
|
+
MyChild = Java::my.pkg.MyChild
|
161
|
+
|
162
|
+
# example specifying each class; 'custom' names may be specified
|
163
|
+
MyBuilder = Cheri::Builder.new_builder do
|
164
|
+
extend_builder Cheri::Swing
|
165
|
+
build MyParent,:pappy
|
166
|
+
build MyChild,:kiddo
|
167
|
+
type MyParent do
|
168
|
+
connect MyChild,:addChild
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
include MyBuilder
|
173
|
+
@frame = swing.frame('My test') {
|
174
|
+
...
|
175
|
+
panel {
|
176
|
+
pappy {
|
177
|
+
kiddo { ... }
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
# example specifying package; default naming
|
183
|
+
MyBuilder = Cheri::Builder.new_builder do
|
184
|
+
extend_builder Cheri::Swing
|
185
|
+
build_package 'my.package'
|
186
|
+
type MyParent do
|
187
|
+
connect MyChild,:addChild
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
include MyBuilder
|
192
|
+
@frame = swing.frame('My test') {
|
193
|
+
...
|
194
|
+
panel {
|
195
|
+
my_parent {
|
196
|
+
my_child { ... }
|
197
|
+
}
|
198
|
+
}
|
199
|
+
}
|
200
|
+
|
201
|
+
You can also use the builder-builder just to add conection logic to Cheri::Swing,
|
202
|
+
as not every possible connection type is defined.
|
203
|
+
|
204
|
+
See the Cheri::JRuby::Explorer (CJX) code (under lib/cheri/jruby/explorer) for
|
205
|
+
extensive examples of Cheri::Swing usage.
|
206
|
+
|
207
|
+
=== Cheri::Xml
|
208
|
+
|
209
|
+
To include:
|
210
|
+
|
211
|
+
require 'rubygems'
|
212
|
+
require 'cheri/xml'
|
213
|
+
...
|
214
|
+
include Cheri::Xml
|
215
|
+
|
216
|
+
Note that inclusion at the top level is not recommended.
|
217
|
+
|
218
|
+
Options:
|
219
|
+
|
220
|
+
xml[:any]
|
221
|
+
xml[:any=>true] #=> Any tag name inside xml {} will be accepted
|
222
|
+
|
223
|
+
xml[:accept=>[:aaa,:bbb,:nnn]] #=> only specified tag names accepted
|
224
|
+
(see builder-builder example below for alternative approach)
|
225
|
+
|
226
|
+
xml[:format]
|
227
|
+
xml[:format=>true] #=> output formatted with line-feeds only
|
228
|
+
|
229
|
+
xml[:indent] #=> output indented by 2 spaces per level
|
230
|
+
xml[:indent=>nnn] #=> output indented by nnn spaces per level
|
231
|
+
|
232
|
+
xml[:margin=>nnn] #=> output indented by margin (in addition to :indent)
|
233
|
+
|
234
|
+
xml[:esc]
|
235
|
+
xml[:esc=>true] #=> output will be escaped (off by default for performance)
|
236
|
+
|
237
|
+
xml[:ns=>:xxx] #=> declare xxx as a namespace prefix
|
238
|
+
xml[:ns=>[:xxx,:yyy,:zzz...]] #=> declare xxx,yyy,zzz as namespace prefixes
|
239
|
+
|
240
|
+
xml[:alias=>[:alias1,:name1,:alias2,:name2...] #=> declare tag aliases
|
241
|
+
|
242
|
+
xml[:attr=>[:alias1,:attr1...]] #=> declare attribute aliases
|
243
|
+
|
244
|
+
Options specified using xml[opts] apply to all threads for an instance.
|
245
|
+
Options specified using xml(opts) apply only to the current thread/scope:
|
246
|
+
|
247
|
+
# example
|
248
|
+
xml[:any=>true,:indent=>3,:esc=>false]
|
249
|
+
@out = xml {
|
250
|
+
# nothing escaped at this level
|
251
|
+
aaa{
|
252
|
+
bbb {
|
253
|
+
xml(:esc=>true) {
|
254
|
+
# everything escaped in this scope
|
255
|
+
ddd { ... }
|
256
|
+
eee { ... }
|
257
|
+
}}}}
|
258
|
+
|
259
|
+
The result of an +xml+ block will be one of several types of object, depending
|
260
|
+
on the tags used and how they are invoked. The result object can be coerced to a String,
|
261
|
+
directly by calling its #to_s method, or indirectly by using << to append it to a
|
262
|
+
String or IO stream. The #to_s method also takes an optional String/stream parameter;
|
263
|
+
for streams, this is the most efficient way to render the XML.
|
264
|
+
|
265
|
+
# example
|
266
|
+
xml[:any,:indent]
|
267
|
+
@result = xml{
|
268
|
+
aaa(:an_attr='a value',:another=>'value 2') {
|
269
|
+
bbb { ccc }
|
270
|
+
}
|
271
|
+
}
|
272
|
+
puts @result #=> XML
|
273
|
+
@result.to_s #=> XML
|
274
|
+
a_string << @result #=> appends XML
|
275
|
+
a_stream << @result #=> appends XML
|
276
|
+
@result.to_s(a_string) #=> appends XML more efficiently
|
277
|
+
@result.to_s(a_stream) #=> appends XML more efficiently
|
278
|
+
|
279
|
+
# result:
|
280
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
281
|
+
<aaa another="value 2" an_attr="a value">
|
282
|
+
<bbb>
|
283
|
+
<ccc />
|
284
|
+
</bbb>
|
285
|
+
</aaa>
|
286
|
+
|
287
|
+
To omit the XML declaration, use +xml+ as the receiver for the initial element:
|
288
|
+
|
289
|
+
xml.aaa{bbb}
|
290
|
+
# result
|
291
|
+
<aaa>
|
292
|
+
<bbb />
|
293
|
+
</aaa>
|
294
|
+
|
295
|
+
Alias element names that are lengthy, or can't be used directly in Ruby:
|
296
|
+
|
297
|
+
xml[:alias=>[:cls,:class]]
|
298
|
+
xml.aaa{cls}
|
299
|
+
# result
|
300
|
+
<aaa>
|
301
|
+
<class />
|
302
|
+
</aaa>
|
303
|
+
|
304
|
+
Declare namespace prefixes, and apply them directly (using myns.tag or myns::tag), or
|
305
|
+
apply them to all elements in a scope:
|
306
|
+
|
307
|
+
xml[:alias=>[:env,:Envelope,:hdr,:Header,:body,:Body]]
|
308
|
+
xml[:ns=>:soap]
|
309
|
+
xml { soap {
|
310
|
+
env(:xxx=>'yyy') {
|
311
|
+
hdr
|
312
|
+
body
|
313
|
+
}}}
|
314
|
+
|
315
|
+
# result
|
316
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
317
|
+
<soap:Envelope xxx="yyy">
|
318
|
+
<soap:Header />
|
319
|
+
<soap:Body />
|
320
|
+
</soap:Envelope>
|
321
|
+
|
322
|
+
Use no_ns to turn off a namespace, or specify a different namespace:
|
323
|
+
|
324
|
+
xml[:alias=>[:env,:Envelope,:hdr,:Header,:body,:Body]]
|
325
|
+
xml[:ns=>[:soap,:xx]]
|
326
|
+
xml {
|
327
|
+
aaa {
|
328
|
+
soap { env {
|
329
|
+
hdr
|
330
|
+
body {
|
331
|
+
no_ns {
|
332
|
+
bbb
|
333
|
+
xx::ccc
|
334
|
+
ddd
|
335
|
+
xx {eee; fff}
|
336
|
+
}}}}}}
|
337
|
+
|
338
|
+
# result
|
339
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
340
|
+
<aaa>
|
341
|
+
<soap:Envelope>
|
342
|
+
<soap:Header />
|
343
|
+
<soap:Body>
|
344
|
+
<bbb />
|
345
|
+
<xx:ccc />
|
346
|
+
<ddd />
|
347
|
+
<xx:eee />
|
348
|
+
<xx:fff />
|
349
|
+
</soap:Body>
|
350
|
+
</soap:Envelope>
|
351
|
+
</aaa>
|
352
|
+
|
353
|
+
Use the Cheri builder-builder to define more explicit element relationships:
|
354
|
+
|
355
|
+
require 'cheri/xml'
|
356
|
+
|
357
|
+
my_content_elems = [:aaa,:bbb,:ccc]
|
358
|
+
my_empty_elems = [:xxx,:yyy]
|
359
|
+
|
360
|
+
MyBuilder = Cheri::Builder.new_builder do
|
361
|
+
extend_builder Cheri::Xml
|
362
|
+
build Cheri::Xml::Elem,my_content_elems
|
363
|
+
build Cheri::Xml::EmptyElem,my_empty_elems
|
364
|
+
symbol :aaa { connect :bbb,:ccc }
|
365
|
+
symbol :bbb { connect :xxx }
|
366
|
+
symbol :ccc { connect :yyy }
|
367
|
+
# raise error to prevent non-connects from silently failing
|
368
|
+
type Cheri::Xml::XmlElement do
|
369
|
+
connect Cheri::Xml::XmlElement do |parent,child|
|
370
|
+
raise TypeError,"can't add #{child.sym} to #{parent.sym}"
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
include Cheri::Xml
|
375
|
+
include MyBuilder
|
376
|
+
|
377
|
+
=== Cheri::Html
|
378
|
+
|
379
|
+
Documentation TBD
|
380
|
+
|
381
|
+
Options:
|
382
|
+
|
383
|
+
html[:format]
|
384
|
+
html[:format=>true] #=> output formatted with line-feeds only
|
385
|
+
|
386
|
+
html[:indent] #=> output indented by 2 spaces per level
|
387
|
+
html[:indent=>nnn] #=> output indented by nnn spaces per level
|
388
|
+
|
389
|
+
html[:margin=>nnn] #=> output indented by margin (in addition to :indent)
|
390
|
+
|
391
|
+
html[:esc]
|
392
|
+
html[:esc=>true] #=> output will be escaped (off by default for performance)
|
393
|
+
|
394
|
+
=== Cheri builder-builder
|
395
|
+
|
396
|
+
Documentation TBD
|
24
397
|
|
25
398
|
== Cheri::JRuby::Explorer (CJX)
|
26
399
|
|
@@ -46,8 +419,7 @@ Alternatively, you can load and run it in one step:
|
|
46
419
|
require 'cheri/cjx'
|
47
420
|
|
48
421
|
This will take several seconds to load and start -- performance will be one area
|
49
|
-
of improvement
|
50
|
-
clear what to do.
|
422
|
+
of ongoing improvement. Once it loads, it should be fairly clear what to do.
|
51
423
|
|
52
424
|
Some known issues:
|
53
425
|
|
@@ -60,8 +432,8 @@ Some known issues:
|
|
60
432
|
GridBagLayout. Ugh.
|
61
433
|
|
62
434
|
* Global variables are currently shown, um, globally, when many of them should be shown
|
63
|
-
per thread. This will be fixed in
|
64
|
-
other goodies as well (thread-local vars, status, etc.).
|
435
|
+
per thread. This will be fixed in a later version, which will include a Thread section
|
436
|
+
with other goodies as well (thread-local vars, status, etc.).
|
65
437
|
|
66
438
|
To install the CJX DRb server component in an instance (assuming the Cheri gem is
|
67
439
|
installed):
|
@@ -87,4 +459,4 @@ Please visit the Cheri site for more documentation, I'll be continually adding t
|
|
87
459
|
in the coming days.
|
88
460
|
|
89
461
|
Bill Dortch <cheri.project@gmail.com>
|
90
|
-
|
462
|
+
19 June 2007
|
data/lib/cheri/awt.rb
CHANGED
@@ -22,8 +22,10 @@
|
|
22
22
|
#++
|
23
23
|
#
|
24
24
|
|
25
|
-
if (defined?JRUBY_VERSION) &&
|
26
|
-
((
|
25
|
+
if (defined?JRUBY_VERSION) &&
|
26
|
+
((JRUBY_VERSION =~ /^(\d+\.\d+\.\d+)([-\.A-Z0-9]*)/ &&
|
27
|
+
(($1 == '1.0.0' && ($2.empty? || $2 >= 'RC3')) || $1 > '1.0.0')) ||
|
28
|
+
(JRUBY_VERSION =~ /^(\d+\.\d+)([-\.A-Z0-9]*)/ && $1 >= '1.1'))
|
27
29
|
|
28
30
|
require 'cheri/java/builder'
|
29
31
|
require 'cheri/builder/awt/types'
|