cheri 0.0.5 → 0.0.6
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.
- 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'
|