jrubyfx-fxmlloader 0.2-java → 0.3-java
Sign up to get free protection for your applications and to get access to all the features.
- data/README +15 -3
- data/Rakefile +1 -1
- data/lib/FXMLLoader-j8.jar +0 -0
- data/lib/fxmlloader/elts.rb +68 -59
- data/lib/fxmlloader/fxml_jit_info.rb +158 -0
- data/lib/fxmlloader/j8_expression_value.rb +148 -101
- data/lib/fxmlloader/real_elts.rb +195 -184
- data/lib/fxmlloader/rorba.rb +3 -29
- data/lib/fxmlloader/rrba.rb +161 -399
- data/lib/fxmlloader/value_elts.rb +13 -23
- data/lib/jrubyfx-fxmlloader.rb +240 -124
- metadata +6 -5
@@ -23,36 +23,18 @@
|
|
23
23
|
# * questions.
|
24
24
|
# */
|
25
25
|
|
26
|
-
#package com.sun.javafx.fxml.expression;
|
27
|
-
#
|
28
|
-
#import java.util.ArrayList;
|
29
|
-
#import java.util.Iterator;
|
30
|
-
#import java.util.List;
|
31
|
-
#
|
32
|
-
#import javafx.beans.InvalidationListener;
|
33
|
-
#import javafx.beans.property.ReadOnlyProperty;
|
34
|
-
#import javafx.beans.value.ChangeListener;
|
35
|
-
#import javafx.beans.value.ObservableValue;
|
36
|
-
#import javafx.beans.value.ObservableValueBase;
|
37
|
-
#import javafx.collections.ListChangeListener;
|
38
|
-
#import javafx.collections.MapChangeListener;
|
39
|
-
#import javafx.collections.ObservableList;
|
40
|
-
#import javafx.collections.ObservableMap;
|
41
|
-
#
|
42
|
-
#import com.sun.javafx.fxml.BeanAdapter;
|
43
26
|
|
44
27
|
#/**
|
45
28
|
# * Class representing an observable expression value.
|
46
29
|
# */
|
47
30
|
class RRExpressionValue < Java::javafx.beans.value.ObservableValueBase
|
48
31
|
#// Monitors a namespace for changes along a key path
|
49
|
-
|
32
|
+
|
50
33
|
|
51
34
|
|
52
35
|
def initialize(namespace, expression, type)
|
53
36
|
super()
|
54
|
-
|
55
|
-
if (namespace == nil)
|
37
|
+
if (namespace == nil)
|
56
38
|
raise "NullPointerException.new();"
|
57
39
|
end
|
58
40
|
|
@@ -60,7 +42,7 @@ class RRExpressionValue < Java::javafx.beans.value.ObservableValueBase
|
|
60
42
|
raise "NullPointerException.new();"
|
61
43
|
end
|
62
44
|
|
63
|
-
if (type == nil)
|
45
|
+
if (type == nil)
|
64
46
|
raise "NullPointerException.new();"
|
65
47
|
end
|
66
48
|
|
@@ -71,21 +53,20 @@ class RRExpressionValue < Java::javafx.beans.value.ObservableValueBase
|
|
71
53
|
@type = type;
|
72
54
|
|
73
55
|
arguments = expression.getArguments();
|
74
|
-
@argumentMonitors = ArrayList.new(arguments.size());
|
56
|
+
@argumentMonitors = java.util.ArrayList.new(arguments.size());
|
75
57
|
|
76
58
|
for argument in arguments
|
77
59
|
@argumentMonitors.add(KeyPathMonitor.new(self, argument.iterator()));
|
78
60
|
end
|
79
61
|
end
|
80
62
|
|
81
|
-
|
63
|
+
|
82
64
|
def getValue()
|
83
|
-
dputs "gettng 8ev for #{self} on #{@expression}"
|
84
65
|
return RubyWrapperBeanAdapter.coerce(@expression.evaluate(@namespace), @type);
|
85
66
|
end
|
86
67
|
|
87
|
-
def addListener( listener)
|
88
|
-
if (@listenerCount == 0)
|
68
|
+
def addListener( listener)
|
69
|
+
if (@listenerCount == 0)
|
89
70
|
monitorArguments();
|
90
71
|
end
|
91
72
|
|
@@ -93,90 +74,152 @@ class RRExpressionValue < Java::javafx.beans.value.ObservableValueBase
|
|
93
74
|
@listenerCount += 1
|
94
75
|
end
|
95
76
|
|
96
|
-
def removeListener( listener)
|
77
|
+
def removeListener( listener)
|
97
78
|
super(listener);
|
98
79
|
@listenerCount-=1
|
99
80
|
|
100
|
-
if (@listenerCount == 0)
|
81
|
+
if (@listenerCount == 0)
|
101
82
|
unmonitorArguments();
|
102
83
|
end
|
103
84
|
end
|
104
85
|
|
105
|
-
def monitorArguments()
|
86
|
+
def monitorArguments()
|
106
87
|
for argumentMonitor in @argumentMonitors
|
107
88
|
argumentMonitor.monitor(@namespace);
|
108
89
|
end
|
109
90
|
end
|
110
91
|
|
111
|
-
def unmonitorArguments()
|
92
|
+
def unmonitorArguments()
|
112
93
|
for argumentMonitor in @argumentMonitors
|
113
94
|
argumentMonitor.unmonitor();
|
114
95
|
end
|
115
96
|
end
|
116
97
|
end
|
117
98
|
|
118
|
-
|
119
|
-
class KeyPathMonitor
|
99
|
+
|
100
|
+
class KeyPathMonitor
|
120
101
|
@key = nil;
|
121
102
|
@next = nil
|
122
103
|
|
123
104
|
@namespace = nil;
|
124
105
|
|
125
|
-
|
126
106
|
|
127
|
-
|
107
|
+
class ListChangeImpl
|
108
|
+
include ListChangeListener
|
109
|
+
|
110
|
+
def initialize(this)
|
111
|
+
@this = this
|
112
|
+
end
|
113
|
+
|
114
|
+
def onChanged(change)
|
115
|
+
@this.list_changed(change)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
class MapChangeImpl
|
121
|
+
include MapChangeListener
|
122
|
+
|
123
|
+
def initialize(this)
|
124
|
+
@this = this
|
125
|
+
end
|
126
|
+
|
127
|
+
def onChanged(change)
|
128
|
+
@this.map_changed(change)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
class ChangeListenerImpl
|
135
|
+
include ChangeListener
|
136
|
+
|
137
|
+
def initialize(this)
|
138
|
+
@this = this
|
139
|
+
end
|
140
|
+
|
141
|
+
def changed(ov, old, new)
|
142
|
+
@this.normal_changed(ov, old, new)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def initialize(this, keyPathIterator)
|
128
147
|
@key = keyPathIterator.next();
|
129
148
|
@this = this
|
130
|
-
|
131
|
-
|
132
|
-
@listChangeListener =
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
149
|
+
|
150
|
+
|
151
|
+
@listChangeListener = ListChangeImpl.new(self)
|
152
|
+
|
153
|
+
|
154
|
+
@mapChangeListener = MapChangeImpl.new(self)
|
155
|
+
|
156
|
+
|
157
|
+
@propertyChangeListener = ChangeListenerImpl.new(self)
|
158
|
+
|
159
|
+
if (keyPathIterator.hasNext())
|
160
|
+
@next = KeyPathMonitor.new(this, keyPathIterator);
|
161
|
+
else
|
162
|
+
@next = nil;
|
141
163
|
end
|
142
|
-
|
164
|
+
end
|
143
165
|
|
144
|
-
|
145
|
-
|
166
|
+
def list_changed(change)
|
167
|
+
while (change.next())
|
168
|
+
index = @key.to_i
|
169
|
+
|
170
|
+
if (index >= change.getFrom() && index < change.getTo())
|
146
171
|
@this.fireValueChangedEvent();
|
147
172
|
remonitor();
|
148
173
|
end
|
149
174
|
end
|
150
|
-
|
175
|
+
end
|
151
176
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
@this.fireValueChangedEvent();
|
158
|
-
remonitor();
|
159
|
-
end
|
177
|
+
def map_changed(change)
|
178
|
+
if (@key == (change.getKey()))
|
179
|
+
@this.fireValueChangedEvent();
|
180
|
+
remonitor();
|
160
181
|
end
|
182
|
+
end
|
161
183
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
@
|
184
|
+
def normal_changed(observable, oldValue, newValue)
|
185
|
+
if (@key == (observable.getName()))
|
186
|
+
|
187
|
+
@this.fireValueChangedEvent();
|
188
|
+
remonitor();
|
166
189
|
end
|
167
190
|
end
|
168
191
|
|
169
|
-
def monitor(namespace)
|
170
|
-
if (namespace.is_a? ObservableList)
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
192
|
+
def monitor(namespace)
|
193
|
+
if (namespace.is_a? ObservableList)
|
194
|
+
old_verbose = $VERBOSE
|
195
|
+
begin
|
196
|
+
$VERBOSE = nil
|
197
|
+
namespace.addListener @listChangeListener
|
198
|
+
ensure
|
199
|
+
# always re-set to old value, even if block raises an exception
|
200
|
+
$VERBOSE = old_verbose
|
201
|
+
end
|
202
|
+
elsif (namespace.is_a? ObservableMap)
|
203
|
+
old_verbose = $VERBOSE
|
204
|
+
begin
|
205
|
+
$VERBOSE = nil
|
206
|
+
namespace.addListener @mapChangeListener
|
207
|
+
ensure
|
208
|
+
# always re-set to old value, even if block raises an exception
|
209
|
+
$VERBOSE = old_verbose
|
210
|
+
end
|
211
|
+
else
|
175
212
|
namespaceAdapter = RubyWrapperBeanAdapter.for(namespace);
|
176
213
|
propertyModel = namespaceAdapter.getPropertyModel(@key).to_java
|
177
|
-
|
178
|
-
|
179
|
-
|
214
|
+
if (propertyModel != nil)
|
215
|
+
old_verbose = $VERBOSE
|
216
|
+
begin
|
217
|
+
$VERBOSE = nil
|
218
|
+
propertyModel.addListener @propertyChangeListener
|
219
|
+
ensure
|
220
|
+
# always re-set to old value, even if block raises an exception
|
221
|
+
$VERBOSE = old_verbose
|
222
|
+
end
|
180
223
|
end
|
181
224
|
|
182
225
|
@namespace = namespaceAdapter;
|
@@ -184,60 +227,64 @@ class KeyPathMonitor
|
|
184
227
|
|
185
228
|
@namespace = namespace;
|
186
229
|
|
187
|
-
if (@next != nil)
|
230
|
+
if (@next != nil)
|
188
231
|
value = Expression.get(@namespace, @key)
|
189
|
-
if (value != nil)
|
232
|
+
if (value != nil)
|
190
233
|
@next.monitor(value);
|
191
234
|
end
|
192
235
|
end
|
193
236
|
end
|
194
237
|
|
195
|
-
def unmonitor()
|
196
|
-
if (@namespace.is_a? ObservableList)
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
238
|
+
def unmonitor()
|
239
|
+
if (@namespace.is_a? ObservableList)
|
240
|
+
old_verbose = $VERBOSE
|
241
|
+
begin
|
242
|
+
$VERBOSE = nil
|
243
|
+
@namespace.removeListener @listChangeListener
|
244
|
+
ensure
|
245
|
+
# always re-set to old value, even if block raises an exception
|
246
|
+
$VERBOSE = old_verbose
|
247
|
+
end
|
248
|
+
elsif (@namespace.is_a? ObservableMap)
|
249
|
+
old_verbose = $VERBOSE
|
250
|
+
begin
|
251
|
+
$VERBOSE = nil
|
252
|
+
@namespace.removeListener @mapChangeListener
|
253
|
+
ensure
|
254
|
+
# always re-set to old value, even if block raises an exception
|
255
|
+
$VERBOSE = old_verbose
|
256
|
+
end
|
257
|
+
elsif (@namespace != nil)
|
201
258
|
namespaceAdapter = @namespace;
|
202
259
|
propertyModel = namespaceAdapter.getPropertyModel(@key);
|
203
260
|
|
204
|
-
if (propertyModel != nil)
|
205
|
-
|
261
|
+
if (propertyModel != nil)
|
262
|
+
old_verbose = $VERBOSE
|
263
|
+
begin
|
264
|
+
$VERBOSE = nil
|
265
|
+
propertyModel.removeListener @propertyChangeListener
|
266
|
+
ensure
|
267
|
+
# always re-set to old value, even if block raises an exception
|
268
|
+
$VERBOSE = old_verbose
|
269
|
+
end
|
206
270
|
end
|
207
271
|
end
|
208
272
|
|
209
273
|
@namespace = nil;
|
210
274
|
|
211
|
-
if (@next != nil)
|
275
|
+
if (@next != nil)
|
212
276
|
@next.unmonitor();
|
213
277
|
end
|
214
278
|
end
|
215
279
|
|
216
|
-
def remonitor()
|
217
|
-
if (@next != nil)
|
280
|
+
def remonitor()
|
281
|
+
if (@next != nil)
|
218
282
|
@next.unmonitor();
|
219
283
|
value = Expression.get(@namespace, @key);
|
220
|
-
if (value != nil)
|
284
|
+
if (value != nil)
|
221
285
|
@next.monitor(value);
|
222
286
|
end
|
223
287
|
end
|
224
288
|
end
|
225
289
|
end
|
226
290
|
|
227
|
-
#class JRExpressionTargetMapping < ChangeListener
|
228
|
-
#
|
229
|
-
# def initialize(paramExpression, paramObject, paramList)
|
230
|
-
#
|
231
|
-
# @source = paramExpression;
|
232
|
-
# @target = paramObject;
|
233
|
-
# @path = paramList;
|
234
|
-
# end
|
235
|
-
#
|
236
|
-
# def changed(ov, ol, ne)
|
237
|
-
#
|
238
|
-
# if (@source.isDefined())
|
239
|
-
# Expression.set(@target, @path, @source.getValue());
|
240
|
-
# end
|
241
|
-
# end
|
242
|
-
#end
|
243
|
-
|
data/lib/fxmlloader/real_elts.rb
CHANGED
@@ -1,16 +1,67 @@
|
|
1
|
+
class OBJFXBuilderWrapper < Java::java.util.AbstractMap
|
2
|
+
include Java::javafx.util.Builder
|
3
|
+
def initialize(safeobj, type)
|
4
|
+
super()
|
5
|
+
@type = type
|
6
|
+
@obj = safeobj
|
7
|
+
end
|
8
|
+
|
9
|
+
def wrapped_class
|
10
|
+
@type
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_put(&on_put)
|
14
|
+
@on_put = on_put
|
15
|
+
end
|
16
|
+
|
17
|
+
def build
|
18
|
+
@obj.build.tap{|x| rmorph self, x}
|
19
|
+
end
|
20
|
+
|
21
|
+
def containsKey(o)
|
22
|
+
@obj.containsKey(o)
|
23
|
+
end
|
24
|
+
|
25
|
+
def get(o)
|
26
|
+
@obj.get(o)
|
27
|
+
end
|
28
|
+
|
29
|
+
def put(k, v)
|
30
|
+
@on_put.call(k, v) if @on_put
|
31
|
+
@obj.put(k, v)
|
32
|
+
end
|
33
|
+
|
34
|
+
def [](o)
|
35
|
+
get(o)
|
36
|
+
end
|
37
|
+
def []=(k, v)
|
38
|
+
put(k, v)
|
39
|
+
end
|
40
|
+
|
41
|
+
def entrySet
|
42
|
+
java.util.HashMap.new({}).entrySet
|
43
|
+
end
|
44
|
+
|
45
|
+
def ==(rhs)
|
46
|
+
self.equal? rhs # do pointer comparison
|
47
|
+
end
|
48
|
+
|
49
|
+
def inspect
|
50
|
+
"#<ObjectBuilderWrapper:#{self.object_id.to_s 16} type=#{@type}, child=#{@obj.class.inspect}>"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
1
54
|
class InstanceDeclarationElement < ValueElement
|
2
55
|
attr_accessor :type, :constant, :factory
|
3
56
|
|
4
57
|
def initialize(current, xmlStreamReader, loadListener, parentLoader, type)
|
5
58
|
super(current, xmlStreamReader, loadListener, parentLoader)
|
6
|
-
dputs "new instances! #{type}"
|
7
59
|
@type = type;
|
8
60
|
@constant = nil;
|
9
61
|
@factory = nil;
|
10
62
|
end
|
11
63
|
|
12
64
|
def processAttribute( prefix, localName, value)
|
13
|
-
dputs callz + "Processing #{prefix} for #{localName} on #{type} value: #{value}"
|
14
65
|
if (prefix != nil && prefix == (FXL::FX_NAMESPACE_PREFIX))
|
15
66
|
if (localName == (FXL::FX_VALUE_ATTRIBUTE))
|
16
67
|
@value = value;
|
@@ -19,18 +70,15 @@ class InstanceDeclarationElement < ValueElement
|
|
19
70
|
elsif (localName == (FXL::FX_FACTORY_ATTRIBUTE))
|
20
71
|
@factory = value;
|
21
72
|
else
|
22
|
-
dputs callz + "SUPER!"
|
23
73
|
super(prefix, localName, value);
|
24
74
|
end
|
25
75
|
else
|
26
|
-
dputs callz + "SUPER2!"
|
27
76
|
super(prefix, localName, value);
|
28
77
|
end
|
29
78
|
end
|
30
79
|
|
31
80
|
def constructValue()
|
32
81
|
value = nil
|
33
|
-
dputs callz + "building new object when #{@value.inspect}, #{constant.inspect}, #{factory.inspect}"
|
34
82
|
if (@value != nil)
|
35
83
|
value = RubyWrapperBeanAdapter.coerce(@value, type);
|
36
84
|
elsif (constant != nil)
|
@@ -52,57 +100,36 @@ class InstanceDeclarationElement < ValueElement
|
|
52
100
|
end
|
53
101
|
else
|
54
102
|
value = (parentLoader.builderFactory == nil) ? nil : parentLoader.builderFactory.getBuilder(type);
|
55
|
-
dputs callz + "now using #{value.class}"
|
56
103
|
if (value.is_a? Builder or (value.respond_to?(:java_object) && value.java_object.is_a?(Builder)))
|
57
104
|
begin
|
58
105
|
value.size
|
59
106
|
rescue java.lang.UnsupportedOperationException => ex
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
def size
|
64
|
-
dputs caller
|
65
|
-
dputs "size waz called!"
|
66
|
-
6
|
67
|
-
end
|
68
|
-
def [](x)
|
69
|
-
get(x)
|
70
|
-
end
|
71
|
-
def []=(x,y)
|
72
|
-
put(x,y)
|
73
|
-
end
|
74
|
-
def has_key?(x)
|
75
|
-
containsKey(x)
|
76
|
-
end
|
77
|
-
def to_s
|
78
|
-
"something interesting...."
|
79
|
-
end
|
80
|
-
def inspect
|
81
|
-
"something equally interesting...."
|
82
|
-
end
|
107
|
+
dputs "########################## WARNING #############################3"
|
108
|
+
value = OBJFXBuilderWrapper.new(value, type)
|
109
|
+
value.on_put {|k, v| rctor value, k, v }
|
83
110
|
end
|
84
111
|
end
|
85
|
-
end
|
86
112
|
if (value == nil)
|
87
113
|
begin
|
88
|
-
dputs callz + "attemping it (#{type} => #{type.inspect})"
|
89
114
|
#TODO: does this work?
|
90
115
|
value = type.ruby_class.new
|
91
|
-
dputs callz + "got taaatempt"
|
92
|
-
dprint callz
|
93
|
-
dp value
|
94
116
|
rescue InstantiationException => exception
|
95
117
|
raise LoadException.new(exception);
|
96
118
|
rescue IllegalAccessException => exception
|
97
119
|
raise LoadException.new(exception);
|
98
120
|
end
|
99
121
|
else
|
100
|
-
|
101
|
-
dputs value.size
|
102
|
-
dputs callz + "parent loader is #{parentLoader.builderFactory} and got #{value} for #{type} (#{value.inspect} #{type.inspect}, #{parentLoader.builderFactory.inspect})"
|
103
|
-
end
|
122
|
+
end
|
104
123
|
end
|
105
|
-
|
124
|
+
if factory
|
125
|
+
rputs value, "build(FactoryBuilderBuilder, #{type.ruby_class}, #{factory.inspect}) do"
|
126
|
+
elsif @value
|
127
|
+
rno_show(value)
|
128
|
+
rputs value, value.inspect
|
129
|
+
else
|
130
|
+
rputs value, "build(#{type.ruby_class}) do"
|
131
|
+
end
|
132
|
+
rnest 1
|
106
133
|
return value;
|
107
134
|
end
|
108
135
|
end
|
@@ -257,14 +284,11 @@ class ReferenceElement < ValueElement
|
|
257
284
|
@source = nil;
|
258
285
|
|
259
286
|
def processAttribute(prefix, localName, value)
|
260
|
-
dputs callz + "processing attrib"
|
261
|
-
dp prefix, localName, value
|
262
287
|
if (prefix == nil)
|
263
288
|
if (localName == (FXL::REFERENCE_SOURCE_ATTRIBUTE))
|
264
289
|
if (loadListener != nil)
|
265
290
|
loadListener.readInternalAttribute(localName, value);
|
266
291
|
end
|
267
|
-
dputs callz + "SAVING SOURCES"
|
268
292
|
@source = value;
|
269
293
|
else
|
270
294
|
super(prefix, localName, value);
|
@@ -386,7 +410,12 @@ class RootElement < ValueElement
|
|
386
410
|
value=nil
|
387
411
|
root = parentLoader.root
|
388
412
|
if (root == nil)
|
389
|
-
|
413
|
+
if $JRUBYFX_AOT_COMPILING
|
414
|
+
root = parentLoader.root = type.ruby_class.new
|
415
|
+
value = root
|
416
|
+
else
|
417
|
+
raise LoadException.new("Root hasn't been set. Use method setRoot() before load.");
|
418
|
+
end
|
390
419
|
else
|
391
420
|
if (!type.isAssignableFrom(root.java_class()))
|
392
421
|
raise LoadException.new("Root is not an instance of " + type.getName() + ".");
|
@@ -394,7 +423,8 @@ class RootElement < ValueElement
|
|
394
423
|
|
395
424
|
value = root;
|
396
425
|
end
|
397
|
-
|
426
|
+
rputs value, "with(__local_fxml_controller) do"
|
427
|
+
rnest 1
|
398
428
|
return value;
|
399
429
|
end
|
400
430
|
end
|
@@ -409,10 +439,6 @@ class PropertyElement < Element
|
|
409
439
|
@sourceType = nil
|
410
440
|
@readOnly = nil
|
411
441
|
super(current, xmlStreamReader, loadListener, parentLoader)
|
412
|
-
dputs (callz) + "Property Elt"
|
413
|
-
dputs callz + name
|
414
|
-
dprint callz
|
415
|
-
dp sourceType
|
416
442
|
if (parent == nil)
|
417
443
|
raise LoadException.new("Invalid root element.");
|
418
444
|
end
|
@@ -432,10 +458,8 @@ class PropertyElement < Element
|
|
432
458
|
|
433
459
|
parentProperties = parent.getProperties();
|
434
460
|
if (parent.isTyped())
|
435
|
-
dputs (callz) +"it be typed"
|
436
461
|
@readOnly = parent.getValueAdapter().read_only?(name);
|
437
462
|
else
|
438
|
-
dputs (callz) +"it be chedrk"
|
439
463
|
# If the map already defines a value for the property, assume
|
440
464
|
# that it is read-only
|
441
465
|
@readOnly = parentProperties.has_key?(name);
|
@@ -446,12 +470,9 @@ class PropertyElement < Element
|
|
446
470
|
if (value == nil)
|
447
471
|
raise LoadException.new("Invalid property.");
|
448
472
|
end
|
449
|
-
dputs (callz) +"saving property #{name} => #{value}"
|
450
473
|
updateValue(value);
|
451
474
|
end
|
452
|
-
dputs (callz) +"doneish"
|
453
475
|
else
|
454
|
-
dputs (callz) +"ITS READ OHLY"
|
455
476
|
# The element represents a static property
|
456
477
|
@readOnly = false;
|
457
478
|
end
|
@@ -462,33 +483,26 @@ class PropertyElement < Element
|
|
462
483
|
end
|
463
484
|
|
464
485
|
def add( element)
|
465
|
-
|
466
|
-
|
467
|
-
dp element
|
468
|
-
dp element.class
|
469
|
-
dp element.java_class
|
470
|
-
if element.class.inspect == "Java::JavaNet::URL"
|
471
|
-
# element = element.java_object
|
472
|
-
end
|
486
|
+
@pushd = true
|
487
|
+
rp = nil
|
473
488
|
# Coerce the element to the list item type
|
474
489
|
if (parent.isTyped())
|
475
490
|
listType = parent.getValueAdapter().getGenericType(name);
|
476
|
-
dputs callz + "Typed and list type is #{listType}"
|
477
491
|
lit = RubyWrapperBeanAdapter.getListItemType(listType)
|
478
|
-
# FIXME: HACK!
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
492
|
+
# FIXME: HACK!
|
493
|
+
if element.class.inspect == "Java::JavaNet::URL"
|
494
|
+
lit = Java::java.lang.String.java_class
|
495
|
+
rp = rget(element).match(/build\(FxmlBuilderBuilder, \{"value"=>(.*)\}, Java::JavaNet::URL\) do\n( )*end/)[1]
|
496
|
+
end
|
483
497
|
element = RubyWrapperBeanAdapter.coerce(element, lit);
|
484
498
|
end
|
485
499
|
|
486
500
|
# Add the item to the list
|
487
|
-
super(element);
|
501
|
+
super(element, name, rp);
|
488
502
|
end
|
489
503
|
|
490
504
|
def set( value)
|
491
|
-
|
505
|
+
@pushd = true
|
492
506
|
# Update the value
|
493
507
|
updateValue(value);
|
494
508
|
|
@@ -507,7 +521,6 @@ class PropertyElement < Element
|
|
507
521
|
end
|
508
522
|
|
509
523
|
def processAttribute( prefix, localName, value)
|
510
|
-
dputs (callz) +"processing #{prefix}, #{localName}, #{value} for #{name}"
|
511
524
|
if (!readOnly)
|
512
525
|
raise LoadException.new("Attributes are not supported for writable property elements.");
|
513
526
|
end
|
@@ -517,17 +530,18 @@ dputs (callz) +"processing #{prefix}, #{localName}, #{value} for #{name}"
|
|
517
530
|
|
518
531
|
def processEndElement()
|
519
532
|
super();
|
520
|
-
dputs (callz) +"ENDENDLT "
|
521
533
|
if (readOnly)
|
522
534
|
processInstancePropertyAttributes();
|
523
535
|
processEventHandlerAttributes();
|
536
|
+
unless @pushd
|
537
|
+
rputs parent.value, "with(get#{@name[0].upcase}#{@name[1..-1]}) do\n#{rget(@value)||@value.inspect}\nend" unless parent.value == @value
|
538
|
+
end
|
524
539
|
end
|
525
540
|
end
|
526
541
|
|
527
542
|
def processCharacters()
|
528
543
|
if (!readOnly)
|
529
544
|
text = xmlStreamReader.getText();
|
530
|
-
dputs (callz) +"whitlespa"
|
531
545
|
#TODO: normal regexes
|
532
546
|
text = extraneousWhitespacePattern.matcher(text).replaceAll(" ");
|
533
547
|
|
@@ -568,118 +582,114 @@ class UnknownStaticPropertyElement < Element
|
|
568
582
|
end
|
569
583
|
|
570
584
|
# Element representing a script block
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
#
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
#
|
641
|
-
|
642
|
-
#
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
# + " is not a valid attribute.");
|
680
|
-
# end
|
681
|
-
# end
|
682
|
-
# end
|
585
|
+
class ScriptElement < Element
|
586
|
+
def initialize(current, xmlStreamReader, loadListener, parentLoader)
|
587
|
+
super
|
588
|
+
@source = nil;
|
589
|
+
@charset = parentLoader.charset;
|
590
|
+
end
|
591
|
+
|
592
|
+
def isCollection()
|
593
|
+
return false;
|
594
|
+
end
|
595
|
+
|
596
|
+
def processStartElement()
|
597
|
+
super();
|
598
|
+
|
599
|
+
if (@source != nil && !staticLoad)
|
600
|
+
i = @source.rindex(".");
|
601
|
+
if (i == nil)
|
602
|
+
raise ("Cannot determine type of script \"" + @source + "\".");
|
603
|
+
end
|
604
|
+
extension = @source[(i + 1)..-1];
|
605
|
+
scriptEngine = nil
|
606
|
+
#TODO: use JRUBY stuff
|
607
|
+
oldLoader = Thread.currentThread().getContextClassLoader();
|
608
|
+
begin
|
609
|
+
Thread.currentThread().setContextClassLoader(classLoader);
|
610
|
+
scriptEngineManager = getScriptEngineManager();
|
611
|
+
scriptEngine = scriptEngineManager.getEngineByExtension(extension);
|
612
|
+
ensure
|
613
|
+
Thread.currentThread().setContextClassLoader(oldLoader);
|
614
|
+
end
|
615
|
+
|
616
|
+
if (scriptEngine == nil)
|
617
|
+
raise ("Unable to locate scripting engine for" + " extension " + extension + ".");
|
618
|
+
end
|
619
|
+
|
620
|
+
scriptEngine.setBindings(scriptEngineManager.getBindings(), ScriptContext.ENGINE_SCOPE);
|
621
|
+
|
622
|
+
begin
|
623
|
+
location = nil
|
624
|
+
if (@source[0] == '/')
|
625
|
+
location = classLoader.getResource(@source[(1)..-1]);
|
626
|
+
else
|
627
|
+
if (parentLoader.location == nil)
|
628
|
+
raise LoadException.new("Base location is undefined.");
|
629
|
+
end
|
630
|
+
|
631
|
+
location = URL.new(parentLoader.location, @source);
|
632
|
+
end
|
633
|
+
|
634
|
+
InputStreamReader scriptReader = nil;
|
635
|
+
begin
|
636
|
+
scriptReader = InputStreamReader.new(location.openStream(), @charset);
|
637
|
+
scriptEngine.eval(scriptReader);
|
638
|
+
rescue ScriptException => exception
|
639
|
+
exception.printStackTrace();
|
640
|
+
ensure
|
641
|
+
if (scriptReader != nil)
|
642
|
+
scriptReader.close();
|
643
|
+
end
|
644
|
+
end
|
645
|
+
rescue IOException => exception
|
646
|
+
raise LoadException.new(exception);
|
647
|
+
end
|
648
|
+
end
|
649
|
+
end
|
650
|
+
|
651
|
+
def processEndElement()
|
652
|
+
super();
|
653
|
+
if (value != nil && !parentLoader.staticLoad)
|
654
|
+
# Evaluate the script
|
655
|
+
begin
|
656
|
+
rputs nil, "__local_sem_lang_inst_#{rget_sem(parentLoader.scriptEngine)}.eval(#{value.to_s.inspect})"
|
657
|
+
parentLoader.scriptEngine.eval( value.to_s);
|
658
|
+
rescue ScriptException => exception
|
659
|
+
STDERR.puts (exception.getMessage());
|
660
|
+
end
|
661
|
+
end
|
662
|
+
end
|
663
|
+
|
664
|
+
def processCharacters()
|
665
|
+
if (@source != nil)
|
666
|
+
raise LoadException.new("Script source already specified.");
|
667
|
+
end
|
668
|
+
|
669
|
+
if (parentLoader.scriptEngine == nil && !parentLoader.staticLoad)
|
670
|
+
raise LoadException.new("Page language not specified.");
|
671
|
+
end
|
672
|
+
updateValue(xmlStreamReader.getText());
|
673
|
+
end
|
674
|
+
|
675
|
+
def processAttribute(prefix, localName, value)
|
676
|
+
if (prefix == nil && localName == (FXL::SCRIPT_SOURCE_ATTRIBUTE))
|
677
|
+
if (loadListener != nil)
|
678
|
+
loadListener.readInternalAttribute(localName, value);
|
679
|
+
end
|
680
|
+
|
681
|
+
@source = value;
|
682
|
+
elsif (localName == (FXL::SCRIPT_CHARSET_ATTRIBUTE))
|
683
|
+
if (loadListener != nil)
|
684
|
+
loadListener.readInternalAttribute(localName, value);
|
685
|
+
end
|
686
|
+
|
687
|
+
@charset = Charset.forName(value);
|
688
|
+
else
|
689
|
+
raise LoadException.new(prefix == nil ? localName : prefix + ":" + localName + " is not a valid attribute.");
|
690
|
+
end
|
691
|
+
end
|
692
|
+
end
|
683
693
|
|
684
694
|
# Element representing a define block
|
685
695
|
class DefineElement < Element
|
@@ -688,6 +698,7 @@ class DefineElement < Element
|
|
688
698
|
end
|
689
699
|
|
690
700
|
def add(element)
|
701
|
+
rputs parent.value, rget(element)
|
691
702
|
# No-op
|
692
703
|
end
|
693
704
|
|