Hi,
I don't want to get people too excited, but I'm working on an Eclipse plugin
for Pivot. At the moment it simply recognises WTKX as an XML format, and
I've extended the XML editor to add a new page called 'Preview'.
My original plan was use the SWT AWT bridge and some very simple code to
render the WTKX. That is, I don't render the the contents of the WTKX using
Pivot code, I simply call paint(Graphics2D) directly.
However, I've hit a couple of problems:
1) SWT AWT Bridge doesn't work on Mac!
The problem is also described here, ignoring the fact that the original
poster isn't actually using the SWT/AWT bridge - he has come across the same
problem as me, that something in Eclipse basically breaks AWT. In his case
he can run it on the command line, but when it comes to using the SWT/AWT
bridge, this has fail written all over it.
I'm looking in to this in more detail, but I wonder if it would be worth
abstracting the graphics context so that it isn't AWT specific? Perhaps a
lot of work, but it would mean I could implement a pure SWT version for
rendering in Eclipse.
2) Instantiation problems when deserialising the WTKX
Here's my rendering code, but in a stand alone way outside of Eclipse (I got
here by trying to debug the SWT/AWT problem) :
public static void main(String[] args) throws Exception {
// Frame frame = new Frame();
Properties props = System.getProperties();
Iterator iter = props.keySet().iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
System.out.println(key + " : " + props.getProperty(key));
}
JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setVisible(true);
JApplet applet = new JApplet();
applet.setSize(800, 600);
frame.add(applet);
frame.setVisible(true);
WTKXSerializer wtkx = new WTKXSerializer();
Object o = wtkx.readObject(new FileInputStream("assets/template.wtkx"));
Window window = null;
if (o instanceof Window) {
window = (Window) o;
} else {
window = new Window();
Component c = (Component) o;
c.setSize(applet.getWidth(), applet.getHeight());
window.add(c);
}
window.setSize(applet.getWidth(), applet.getHeight());
window.validate();
Graphics2D g2d = (Graphics2D) applet.getGraphics();
window.paint(g2d);
}
Similar code will be used inside the Eclipse plugin to render the WTKX in
the Eclipse editor - as you can see, it's a render-only process, it doesn't
handle events or anything like that.
Now this actually works OK for the given WTKX:
<BoxPane xmlns="org.apache.pivot.wtk"
xmlns:wtkx="http://pivot.apache.org/wtkx">
<Label wtkx:id="label" text="Enter your name: "/>
<TextInput preferredWidth="200" />
</BoxPane>
But, if I drop in a Button, like this:
<BoxPane xmlns="org.apache.pivot.wtk"
xmlns:wtkx="http://pivot.apache.org/wtkx">
<Label wtkx:id="label" text="Enter your name: "/>
<TextInput preferredWidth="200" />
<Button label="Submit" />
</BoxPane>
I get some exceptions:
An error occurred while processing element <BoxPane> starting at line
number 6:
org.apache.pivot.serialization.SerializationException:
java.lang.InstantiationException
at
org.apache.pivot.wtkx.WTKXSerializer.processStartElement(WTKXSerializer.java:585)
at org.apache.pivot.wtkx.WTKXSerializer.readObject(WTKXSerializer.java:426)
at
org.apache.pivot.wtkxeditor.editors.WTKXPreviewer.main(WTKXPreviewer.java:37)
Caused by: java.lang.InstantiationException
at
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at
org.apache.pivot.wtkx.WTKXSerializer.processStartElement(WTKXSerializer.java:583)
... 2 more
Exception in thread "main"
org.apache.pivot.serialization.SerializationException:
java.lang.InstantiationException
at
org.apache.pivot.wtkx.WTKXSerializer.processStartElement(WTKXSerializer.java:585)
at org.apache.pivot.wtkx.WTKXSerializer.readObject(WTKXSerializer.java:426)
at
org.apache.pivot.wtkxeditor.editors.WTKXPreviewer.main(WTKXPreviewer.java:37)
Caused by: java.lang.InstantiationException
at
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at
org.apache.pivot.wtkx.WTKXSerializer.processStartElement(WTKXSerializer.java:583)
... 2 more
I realise my circumventing the usual Pivot lifecycle might have something to
do with it, so any ideas?
If I can get around problem #2 somehow I think I can still produce an alpha
version Eclipse plugin that will work on Windows/Linux, just not Mac =( but
like I say - being able to implement a pure SWT graphics context would get
around that problem.
Cheers,
Chris