jrubyfx-fxmlloader 0.2-java → 0.3-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.
- 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
|
|