/*******************************************************************************
* Copyright 2010 Simon Mieth
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.kabeja.ui.viewer;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.JSVGScrollPane;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.ImageTranscoder;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.w3c.dom.svg.SVGDocument;
import de.miethxml.toolkit.ui.SmallShadowBorder;
/**
* This is a very simple SVGViewer.
*
* @author <a href="mailto:simon.mieth@gmx.de">Simon Mieth</a>
*
*/
public class SVGViewer {
private JFrame frame;
private JTextField uriField;
private JSVGCanvas svgCanvas;
private JFileChooser fc;
private JLabel infoLabel;
private CardLayout cards;
private JPanel parentPanel;
private SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory("org.kabeja.svg.DXF2SVGReader",
true);
private double scaleXY = 1.0;
/**
*
*/
public SVGViewer() {
super();
}
public void initialize() {
frame = new JFrame("SVGViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// the uri-panel
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 3));
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
panel.add(new JLabel("Url:"));
uriField = new JTextField(30);
uriField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Runnable r = new Runnable() {
public void run() {
load(new File(uriField.getText()));
}
};
Thread t = new Thread(r);
t.start();
}
});
panel.add(uriField);
fc = new JFileChooser();
JButton button = new JButton("Open");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int value = fc.showOpenDialog(frame);
if (value == JFileChooser.APPROVE_OPTION) {
svgCanvas.setSVGDocument(null);
Runnable r = new Runnable() {
public void run() {
infoLabel.setText("Starting ......");
cards.show(parentPanel, "info");
File file = fc.getSelectedFile();
uriField.setText(file.getAbsolutePath());
load(file);
}
};
Thread t = new Thread(r);
t.start();
}
}
});
panel.add(button);
button = new JButton("Zoom in");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
AffineTransform at = new AffineTransform();
scaleXY += .3;
at.setToScale(scaleXY, scaleXY);
svgCanvas.setRenderingTransform(at);
}
});
}
});
panel.add(button);
button = new JButton("Zoom out");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
AffineTransform at = new AffineTransform();
scaleXY -= .3;
at.setToScale(scaleXY, scaleXY);
svgCanvas.setRenderingTransform(at);
}
});
}
});
panel.add(button);
button = new JButton("Export JPEG");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int value = fc.showSaveDialog(frame);
if (value == JFileChooser.APPROVE_OPTION) {
Runnable r = new Runnable() {
public void run() {
File file = fc.getSelectedFile();
try {
saveToJPEG(new FileOutputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
};
Thread t = new Thread(r);
t.start();
}
}
});
panel.add(button);
frame.getContentPane().add(panel, BorderLayout.NORTH);
cards = new CardLayout();
parentPanel = new JPanel(cards);
svgCanvas = new JSVGCanvas();
svgCanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
infoLabel.setText("Loading Draft...");
}
public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
infoLabel.setText("Draft Loaded.");
}
});
svgCanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
public void gvtBuildStarted(GVTTreeBuilderEvent e) {
infoLabel.setText("Building...");
}
public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
infoLabel.setText("Build Done.");
}
});
svgCanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
infoLabel.setText("Rendering Draft...");
}
public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
infoLabel.setText("");
cards.show(parentPanel, "view");
}
});
JSVGScrollPane sp = new JSVGScrollPane(svgCanvas);
sp.setBorder(new SmallShadowBorder());
parentPanel.add(sp, "view");
parentPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
infoLabel = new JLabel("DXF2SVGViewer", JLabel.CENTER);
parentPanel.add(infoLabel, "info");
parentPanel.setPreferredSize(new Dimension(640, 480));
frame.getContentPane().add(parentPanel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
public void load(File file) {
// try {
if (file.exists()) {
//FileInputStream in = new FileInputStream(file);
load(file.toURI().toASCIIString());
} else {
System.out.println("no file:" + file);
}
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
}
public void load(String uri) {
try {
System.gc();
SAXSVGDocumentFactory f = null;
if (uri.toLowerCase().endsWith(".dxf")) {
f = factory;
} else {
f = new SAXSVGDocumentFactory(null);
}
SVGDocument doc = f.createSVGDocument(uri);
this.svgCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
// add a script to doc here by adding the script element
this.svgCanvas.setSVGDocument(doc);
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(frame, e.getMessage(), "Error",
JOptionPane.ERROR_MESSAGE);
infoLabel.setText("Error:" + e.getLocalizedMessage());
} catch (Error e) {
e.printStackTrace();
JOptionPane.showMessageDialog(frame, e.getMessage(), "Error",
JOptionPane.ERROR_MESSAGE);
infoLabel.setText("Error:" + e.getLocalizedMessage());
}
}
public void saveToJPEG(OutputStream out) {
ImageTranscoder trans = new JPEGTranscoder();
try {
trans.transcode(new TranscoderInput(this.svgCanvas.getSVGDocument()),
new TranscoderOutput(out));
} catch (TranscoderException e) {
e.printStackTrace();
}
}
}