/*
* #%L
* BSD implementations of Bio-Formats readers and writers
* %%
* Copyright (C) 2005 - 2015 Open Microscopy Environment:
* - Board of Regents of the University of Wisconsin-Madison
* - Glencoe Software, Inc.
* - University of Dundee
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/
package loci.formats.tools;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import loci.common.Constants;
import loci.common.RandomAccessInputStream;
import loci.common.RandomAccessOutputStream;
import loci.formats.FormatException;
import loci.formats.tiff.TiffParser;
import loci.formats.tiff.TiffSaver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Provides a GUI for editing TIFF file comments.
*
* @author Curtis Rueden ctrueden at wisc.edu
*/
public class EditTiffG extends JFrame implements ActionListener {
// -- Constants --
private static final String TITLE = "EditTiffG";
private static final Logger LOGGER = LoggerFactory.getLogger(EditTiffG.class);
// -- Fields --
private JTextArea textArea;
private JFileChooser fileBox;
private File file;
// -- Constructor --
public EditTiffG() {
setTitle(TITLE);
setLayout(new BorderLayout());
textArea = new JTextArea(25, 80);
add(new JScrollPane(textArea), BorderLayout.CENTER);
//textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
JMenuBar menubar = new JMenuBar();
setJMenuBar(menubar);
JMenu file = new JMenu("File");
menubar.add(file);
JMenuItem fileOpen = new JMenuItem("Open");
file.add(fileOpen);
fileOpen.addActionListener(this);
fileOpen.setActionCommand("open");
JMenuItem fileSave = new JMenuItem("Save");
file.add(fileSave);
fileSave.addActionListener(this);
fileSave.setActionCommand("save");
JMenuItem fileExit = new JMenuItem("Exit");
file.add(fileExit);
fileExit.addActionListener(this);
fileExit.setActionCommand("exit");
fileBox = new JFileChooser(System.getProperty("user.dir"));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
// -- EditTiffG methods --
public String getXML() {
return textArea.getText();
}
public void setXML(String xml) {
textArea.setText(xml);
}
public void open() {
int rval = fileBox.showOpenDialog(this);
if (rval != JFileChooser.APPROVE_OPTION) return;
File f = fileBox.getSelectedFile();
openFile(f);
}
public void save() {
saveFile(file);
}
public void exit() {
System.exit(0);
}
public void openFile(File f) {
try {
String id = f.getAbsolutePath();
String xml = new TiffParser(id).getComment();
setXML(xml);
file = f;
setTitle(TITLE + " - " + id);
}
catch (IOException exc) {
showError(exc);
}
}
public void saveFile(File f) {
RandomAccessInputStream in = null;
RandomAccessOutputStream out = null;
try {
String xml = getXML();
String path = f.getAbsolutePath();
in = new RandomAccessInputStream(path);
out = new RandomAccessOutputStream(path);
TiffSaver saver = new TiffSaver(out, path);
saver.overwriteComment(in, xml);
}
catch (FormatException exc) {
showError(exc);
}
catch (IOException exc) {
showError(exc);
} finally {
try {
if (in != null) in.close();
} catch (Exception e) {}
try {
if (out != null) out.close();
} catch (Exception e) {}
}
}
public void showError(Throwable t) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
String error = "";
try {
t.printStackTrace(
new PrintWriter(new OutputStreamWriter(out, Constants.ENCODING)));
error = new String(out.toByteArray(), Constants.ENCODING);
}
catch (UnsupportedEncodingException e) {
LOGGER.warn("Failed to show error", e);
}
JOptionPane.showMessageDialog(this, "Sorry, there was an error: " + error,
TITLE, JOptionPane.ERROR_MESSAGE);
}
public static void openFile(String filename) {
EditTiffG etg = new EditTiffG();
File f = new File(filename);
if (f.exists()) etg.openFile(f);
}
// -- ActionListener methods --
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if ("open".equals(cmd)) open();
else if ("save".equals(cmd)) save();
else if ("exit".equals(cmd)) exit();
}
// -- Main method --
public static void main(String[] args) throws Exception {
EditTiffG.openFile(args[0]);
}
}