/*
* @(#)SVGDrawingPanelSample.java
*
* Copyright (c) 2009-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.mini;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.jhotdraw.draw.Drawing;
import org.jhotdraw.draw.io.InputFormat;
import org.jhotdraw.draw.io.OutputFormat;
import org.jhotdraw.gui.BackgroundTask;
import org.jhotdraw.gui.Worker;
import org.jhotdraw.gui.filechooser.ExtensionFileFilter;
/**
* Example showing how to embed the {@link org.jhotdraw.samples.svg.SVGDrawingPanel} into an application
* that does not make use of the JHotDraw application framework.
* <p>
* In this case, the application consists of a JFrame with a File menu.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class SVGDrawingPanelSample extends javax.swing.JFrame {
private static final long serialVersionUID = 1L;
/** Holds the file chooser for opening a file. */
private JFileChooser openChooser;
/** Holds the file chooser for saving a file. */
private JFileChooser saveChooser;
/** Maps file filters to input formats, so that we can
* determine the input format that the user selected for
* opening a drawing.
*/
private HashMap<javax.swing.filechooser.FileFilter, InputFormat> fileFilterInputFormatMap;
/** Maps file filters to output formats, so that we can
* determine the output format that the user selected for
* opening a drawing.
*/
private HashMap<javax.swing.filechooser.FileFilter, OutputFormat> fileFilterOutputFormatMap;
/** Holds the currently opened file. */
private File file;
/** Creates new form SVGDrawingPanelSample */
public SVGDrawingPanelSample() {
initComponents();
setSize(new Dimension(600, 400));
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
svgPanel = new org.jhotdraw.samples.svg.SVGDrawingPanel();
menuBar = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
openMenuItem = new javax.swing.JMenuItem();
saveAsMenuItem = new javax.swing.JMenuItem();
FormListener formListener = new FormListener();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(svgPanel, java.awt.BorderLayout.CENTER);
fileMenu.setText("File");
openMenuItem.setText("Open...");
openMenuItem.addActionListener(formListener);
fileMenu.add(openMenuItem);
saveAsMenuItem.setText("Save As...");
saveAsMenuItem.addActionListener(formListener);
fileMenu.add(saveAsMenuItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
pack();
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ActionListener {
FormListener() {}
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == openMenuItem) {
SVGDrawingPanelSample.this.open(evt);
}
else if (evt.getSource() == saveAsMenuItem) {
SVGDrawingPanelSample.this.saveAs(evt);
}
}
}// </editor-fold>//GEN-END:initComponents
/** Opens a drawing from a file. */
private void open(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_open
JFileChooser fc = getOpenChooser();
if (file != null) {
fc.setSelectedFile(file);
}
if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
svgPanel.setEnabled(false);
final File selectedFile = fc.getSelectedFile();
final InputFormat selectedFormat = fileFilterInputFormatMap.get(fc.getFileFilter());
new BackgroundTask() {
@Override
protected void construct() throws IOException {
svgPanel.read(selectedFile.toURI(), selectedFormat);
}
@Override
protected void done() {
file = selectedFile;
setTitle(file.getName());
}
@Override
protected void failed(Throwable error) {
error.printStackTrace();
JOptionPane.showMessageDialog(SVGDrawingPanelSample.this,
"<html><b>Couldn't open file \"" + selectedFile.getName() + "\"<br>" +
error.toString(), "Open File", JOptionPane.ERROR_MESSAGE);
}
@Override
protected void finished() {
svgPanel.setEnabled(true);
}
}.start();
}
}//GEN-LAST:event_open
/** Saves a drawing to a file. */
private void saveAs(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAs
JFileChooser fc = getSaveChooser();
if (file != null) {
fc.setSelectedFile(file);
}
if (fc.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
svgPanel.setEnabled(false);
final File selectedFile;
if (fc.getFileFilter() instanceof ExtensionFileFilter) {
selectedFile = ((ExtensionFileFilter) fc.getFileFilter()).makeAcceptable(fc.getSelectedFile());
} else {
selectedFile = fc.getSelectedFile();
}
final OutputFormat selectedFormat = fileFilterOutputFormatMap.get(fc.getFileFilter());
new BackgroundTask() {
@Override
protected void construct() throws IOException {
svgPanel.write(selectedFile.toURI(), selectedFormat);
}
@Override
protected void done() {
file = selectedFile;
setTitle(file.getName());
}
@Override
protected void failed(Throwable error) {
error.printStackTrace();
JOptionPane.showMessageDialog(SVGDrawingPanelSample.this,
"<html><b>Couldn't save to file \"" + selectedFile.getName() + "\"<br>" +
error.toString(), "Save As File", JOptionPane.ERROR_MESSAGE);
}
@Override
protected void finished() {
svgPanel.setEnabled(true);
}
}.start();
}
}//GEN-LAST:event_saveAs
/** Lazily creates a JFileChooser and returns it. */
private JFileChooser getOpenChooser() {
if (openChooser == null) {
openChooser = new JFileChooser();
Drawing d = svgPanel.getDrawing();
fileFilterInputFormatMap = new HashMap<javax.swing.filechooser.FileFilter, InputFormat>();
javax.swing.filechooser.FileFilter firstFF = null;
for (InputFormat format : d.getInputFormats()) {
javax.swing.filechooser.FileFilter ff = format.getFileFilter();
if (firstFF == null) {
firstFF = ff;
}
fileFilterInputFormatMap.put(ff, format);
openChooser.addChoosableFileFilter(ff);
}
openChooser.setFileFilter(firstFF);
openChooser.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("fileFilterChanged".equals(evt.getPropertyName())) {
InputFormat inputFormat = fileFilterInputFormatMap.get(evt.getNewValue());
openChooser.setAccessory((inputFormat == null) ? null : inputFormat.getInputFormatAccessory());
}
}
});
}
return openChooser;
}
/** Lazily creates a JFileChooser and returns it. */
private JFileChooser getSaveChooser() {
if (saveChooser == null) {
saveChooser = new JFileChooser();
Drawing d = svgPanel.getDrawing();
fileFilterOutputFormatMap = new HashMap<javax.swing.filechooser.FileFilter, OutputFormat>();
javax.swing.filechooser.FileFilter firstFF = null;
for (OutputFormat format : d.getOutputFormats()) {
javax.swing.filechooser.FileFilter ff = format.getFileFilter();
if (firstFF == null) {
firstFF = ff;
}
fileFilterOutputFormatMap.put(ff, format);
saveChooser.addChoosableFileFilter(ff);
}
saveChooser.setFileFilter(firstFF);
saveChooser.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("fileFilterChanged".equals(evt.getPropertyName())) {
OutputFormat outputFormat = fileFilterOutputFormatMap.get(evt.getNewValue());
saveChooser.setAccessory((outputFormat == null) ? null : outputFormat.getOutputFormatAccessory());
}
}
});
}
return saveChooser;
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new SVGDrawingPanelSample().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenu fileMenu;
private javax.swing.JMenuBar menuBar;
private javax.swing.JMenuItem openMenuItem;
private javax.swing.JMenuItem saveAsMenuItem;
private org.jhotdraw.samples.svg.SVGDrawingPanel svgPanel;
// End of variables declaration//GEN-END:variables
}