/*
* @(#)DrawLiveConnectApplet.java
*
* Copyright (c) 1996-2010 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.samples.draw;
import org.jhotdraw.draw.Drawing;
import org.jhotdraw.draw.TextFigure;
import org.jhotdraw.gui.*;
import java.awt.*;
import java.awt.geom.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import netscape.javascript.JSObject;
import org.jhotdraw.xml.*;
/**
* DrawLiveConnectApplet. Supports loading and saving of images to JavaScript.
*
* @author wrandels
* @version $Id$
*/
public class DrawLiveConnectApplet extends JApplet {
private static final long serialVersionUID = 1L;
private static final String VERSION = "7.0.8";
private static final String NAME = "JHotDraw Draw";
/** Initializes the applet DrawApplet */
@Override
public void init() {
// Set look and feel
// -----------------
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Throwable e) {
// Do nothing.
// If we can't set the desired look and feel, UIManager does
// automaticaly the right thing for us.
}
// Display copyright info while we are loading the data
// ----------------------------------------------------
Container c = getContentPane();
c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));
String[] lines = getAppletInfo().split("\n");//Strings.split(getAppletInfo(), '\n');
for (int i = 0; i < lines.length; i++) {
c.add(new JLabel(lines[i]));
}
// We load the data using a worker thread
// --------------------------------------
new Worker<Drawing>() {
@Override
protected Drawing construct() throws IOException {
Drawing result;
if (getParameter("data") != null && getParameter("data").length() > 0) {
NanoXMLDOMInput domi = new NanoXMLDOMInput(new DrawFigureFactory(), new StringReader(getParameter("data")));
result = (Drawing) domi.readObject(0);
} else if (getParameter("datafile") != null) {
InputStream in = null;
try {
URL url = new URL(getDocumentBase(), getParameter("datafile"));
in = url.openConnection().getInputStream();
NanoXMLDOMInput domi = new NanoXMLDOMInput(new DrawFigureFactory(), in);
result = (Drawing) domi.readObject(0);
} finally {
if (in != null) {
in.close();
}
}
} else {
result = null;
}
return result;
}
@Override
protected void done(Drawing result) {
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.removeAll();
initComponents();
if (result != null) {
setDrawing(result);
}
}
@Override
protected void failed(Throwable result) {
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.removeAll();
initComponents();
getDrawing().add(new TextFigure(result.toString()));
result.printStackTrace();
}
@Override
protected void finished() {
Container c = getContentPane();
boolean isLiveConnect;
try {
Class.forName("netscape.javascript.JSObject");
isLiveConnect = true;
} catch (Throwable t) {
isLiveConnect = false;
}
loadButton.setEnabled(isLiveConnect && getParameter("dataread") != null);
saveButton.setEnabled(isLiveConnect && getParameter("datawrite") != null);
if (isLiveConnect) {
String methodName = getParameter("dataread");
if (methodName.indexOf('(') > 0) {
methodName = methodName.substring(0, methodName.indexOf('(') - 1);
}
JSObject win = JSObject.getWindow(DrawLiveConnectApplet.this);
Object data = win.call(methodName, new Object[0]);
if (data instanceof String) {
setData((String) data);
}
}
c.validate();
}
}.start();
}
private void setDrawing(Drawing d) {
drawingPanel.setDrawing(d);
}
private Drawing getDrawing() {
return drawingPanel.getDrawing();
}
public void setData(String text) {
if (text != null && text.length() > 0) {
StringReader in = new StringReader(text);
try {
NanoXMLDOMInput domi = new NanoXMLDOMInput(new DrawFigureFactory(), in);
setDrawing((Drawing) domi.readObject(0));
} catch (Throwable e) {
getDrawing().removeAllChildren();
TextFigure tf = new TextFigure();
tf.setText(e.getMessage());
tf.setBounds(new Point2D.Double(10, 10), new Point2D.Double(100, 100));
getDrawing().add(tf);
e.printStackTrace();
} finally {
in.close();
}
}
}
public String getData() {
CharArrayWriter out = new CharArrayWriter();
try {
NanoXMLDOMOutput domo = new NanoXMLDOMOutput(new DrawFigureFactory());
domo.writeObject(getDrawing());
domo.save(out);
} catch (IOException e) {
TextFigure tf = new TextFigure();
tf.setText(e.getMessage());
tf.setBounds(new Point2D.Double(10, 10), new Point2D.Double(100, 100));
getDrawing().add(tf);
e.printStackTrace();
} finally {
out.close();
}
return out.toString();
}
@Override
public String[][] getParameterInfo() {
return new String[][]{
{"data", "String", "the data to be displayed by this applet."},
{"datafile", "URL", "an URL to a file containing the data to be displayed by this applet."},
{"dataread", "function()", "the name of a JavaScript function which can be used to read the data."},
{"datawrite", "function()", "the name of a JavaScript function which can be used to write the data."}
};
}
@Override
public String getAppletInfo() {
return NAME
+ "\nVersion " + VERSION
+ "\n\nCopyright 1996-2009 (c) by the authors of JHotDraw"
+ "\nThis software is licensed under LGPL or"
+ "\nCreative Commons 3.0 BY";
}
/** This method is called from within the init() method to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
toolButtonGroup = new javax.swing.ButtonGroup();
drawingPanel = new org.jhotdraw.samples.draw.DrawingPanel();
jToolBar1 = new javax.swing.JToolBar();
loadButton = new javax.swing.JButton();
saveButton = new javax.swing.JButton();
FormListener formListener = new FormListener();
getContentPane().add(drawingPanel, java.awt.BorderLayout.CENTER);
jToolBar1.setFloatable(false);
loadButton.setText("Laden");
loadButton.addActionListener(formListener);
jToolBar1.add(loadButton);
saveButton.setText("Speichern");
saveButton.addActionListener(formListener);
jToolBar1.add(saveButton);
getContentPane().add(jToolBar1, java.awt.BorderLayout.SOUTH);
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ActionListener {
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == loadButton) {
DrawLiveConnectApplet.this.load(evt);
}
else if (evt.getSource() == saveButton) {
DrawLiveConnectApplet.this.save(evt);
}
}
}//GEN-END:initComponents
private void save(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_save
try {
String methodName = getParameter("datawrite");
if (methodName.indexOf('(') > 0) {
methodName = methodName.substring(0, methodName.indexOf('(') - 1);
}
JSObject win = JSObject.getWindow(this);
win.call(methodName, new Object[]{getData()});
} catch (Throwable t) {
TextFigure tf = new TextFigure("Fehler: " + t);
AffineTransform tx = new AffineTransform();
tx.translate(10, 20);
tf.transform(tx);
getDrawing().add(tf);
}
}//GEN-LAST:event_save
private void load(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_load
try {
String methodName = getParameter("dataread");
if (methodName.indexOf('(') > 0) {
methodName = methodName.substring(0, methodName.indexOf('(') - 1);
}
JSObject win = JSObject.getWindow(this);
Object result = win.call(methodName, new Object[0]);
if (result instanceof String) {
setData((String) result);
}
} catch (Throwable t) {
TextFigure tf = new TextFigure("Fehler: " + t);
AffineTransform tx = new AffineTransform();
tx.translate(10, 20);
tf.transform(tx);
getDrawing().add(tf);
}
}//GEN-LAST:event_load
// Variables declaration - do not modify//GEN-BEGIN:variables
private org.jhotdraw.samples.draw.DrawingPanel drawingPanel;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JButton loadButton;
private javax.swing.JButton saveButton;
private javax.swing.ButtonGroup toolButtonGroup;
// End of variables declaration//GEN-END:variables
}