package edu.stanford.rsl.apps.gui;
import ij.IJ;
import ij.ImagePlus;
import ij.ImageStack;
import ij.io.FileInfo;
import ij.io.FileOpener;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import edu.stanford.rsl.conrad.geometry.trajectories.Trajectory;
import edu.stanford.rsl.conrad.utils.Configuration;
/**
* User interface to read raw data. Allows also the reading of DICOM data in a zip file.
* @author akmaier
*
*/
public class RawDataOpener extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = -1952776160986620856L;
private JButton jButtonLittle;
private JButton jButtonBig;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JTextField jOffset;
private JTextField jTextFieldStack;
private JButton jButtonDouble;
private JTextField jTextFieldHeight;
private JTextField jTextFieldWidth;
private JLabel jLabel1;
private JButton jButtonSShort;
private JButton jButtonShort;
private JButton jButtonFloat;
private class OpenerTransferHandler extends TransferHandler {
/**
*
*/
private static final long serialVersionUID = 2183195105160823169L;
RawDataOpener field;
public OpenerTransferHandler(RawDataOpener field){
super();
this.field = field;
}
public boolean canImport(TransferHandler.TransferSupport support) {
if (!support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
return false;
}
boolean copySupported = (COPY & support.getSourceDropActions()) == COPY;
if (!copySupported) {
return false;
}
support.setDropAction(COPY);
return true;
}
@SuppressWarnings("unchecked")
public boolean importData(TransferHandler.TransferSupport support) {
if (!canImport(support)) {
return false;
}
Transferable t = support.getTransferable();
try {
java.util.List<File> l =
(java.util.List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
FileInfo fi = field.getFileInfo();
if (l.size() > 1) {
File [] filenames = new File [l.size()];
for (int i = 0; i < l.size(); i++){
filenames[i] = l.get(i);
}
openFileList(filenames, fi).show();
} else {
File file = l.get(0);
if (file.isDirectory()){
//System.out.println(file.listFiles().length);
openFileList(file.listFiles(), fi).show();
} else {
if (file.getName().endsWith(".zip")) {
// ImageJ does not allow to override the reading of ZIP files.
// Hence, we do this here.
String className ="ZIP_Reader";
String path = file.getAbsolutePath();
Object o = IJ.runPlugIn(className, path);
if (o instanceof ImagePlus) {
// plugin extends ImagePlus class
ImagePlus imp = (ImagePlus)o;
imp.show();
}
} else {
openImage(file, fi).show();
}
}
}
} catch (UnsupportedFlavorException e) {
return false;
} catch (IOException e) {
return false;
}
return true;
}
}
private ImagePlus openFileList(File [] files, FileInfo fi){
ImagePlus image = null;
if (fi.nImages > 1){
ImageStack stack = null;
for (File file: files){
ImagePlus img = openImage(file, fi);
if (stack == null) stack = new ImageStack(img.getWidth(), img.getHeight());
for (int i =1; i <= img.getStackSize(); i++){
stack.addSlice("slice " + i, img.getStack().getProcessor(i));
}
}
image = new ImagePlus();
image.setStack(files[0].getName(), stack);
image.setOpenAsHyperStack(true);
image.setDimensions(1, fi.nImages, files.length);
} else {
image = openImageSequence(files, fi);
}
return image;
}
public static RawDataOpener opener = null;
public static RawDataOpener getRawDataOpener(){
if (opener == null){
new RawDataOpener();
}
return opener;
}
public ImagePlus openImage(File file, FileInfo fi){
fi.directory = file.getParent();
fi.fileName = file.getName();
FileOpener open = new FileOpener(fi);
return open.open(false);
}
public ImagePlus openImageSequence(File [] filenames, FileInfo fi){
//Arrays.sort(filenames);
ImageStack stack = new ImageStack(fi.width, fi.height);
for (int i = 0; i < filenames.length; i++){
File file = filenames[i];
stack.addSlice("Image " + i, openImage(file, fi).getChannelProcessor());
}
ImagePlus stackImage = new ImagePlus();
stackImage.setStack(filenames[0].getName(), stack);
return stackImage;
}
public RawDataOpener(){
super("Raw Data Opener");
initGUI();
opener = this;
}
private void initGUI() {
try {
{
TransferHandler th = new OpenerTransferHandler(this);
GridBagLayout thisLayout = new GridBagLayout();
thisLayout.rowWeights = new double[] {0.1, 0.1, 0.1, 0.1, 0.0};
thisLayout.rowHeights = new int[] {20, 20, 20, 20, 7};
thisLayout.columnWeights = new double[] {0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1};
thisLayout.columnWidths = new int[] {20, 20, 20, 20, 20, 20, 20, 20};
getContentPane().setLayout(thisLayout);
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
{
jButtonLittle = new JButton();
getContentPane().add(jButtonLittle, new GridBagConstraints(4, 2, 4, 2, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
jButtonLittle.setText("little Endian");
jButtonLittle.addActionListener(this);
jButtonLittle.setTransferHandler(th);
}
{
jButtonBig = new JButton();
getContentPane().add(jButtonBig, new GridBagConstraints(4, 0, 4, 2, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
jButtonBig.setText("big Endian");
jButtonBig.addActionListener(this);
jButtonBig.setTransferHandler(th);
}
{
jButtonFloat = new JButton();
getContentPane().add(jButtonFloat, new GridBagConstraints(0, 2, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
jButtonFloat.setText("Float 32 Bit");
jButtonFloat.addActionListener(this);
jButtonFloat.setTransferHandler(th);
}
{
jButtonDouble = new JButton();
getContentPane().add(jButtonDouble, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
jButtonDouble.setText("Float 64 Bit");
jButtonDouble.addActionListener(this);
jButtonDouble.setTransferHandler(th);
}
{
jButtonShort = new JButton();
getContentPane().add(jButtonShort, new GridBagConstraints(0, 1, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
jButtonShort.setText("Unsigned Short");
jButtonShort.addActionListener(this);
jButtonShort.setTransferHandler(th);
}
{
jLabel1 = new JLabel("Width:");
jLabel2 = new JLabel("Height:");
Trajectory geometry = Configuration.getGlobalConfiguration().getGeometry();
if (geometry != null) {
jTextFieldWidth = new JTextField("" + geometry.getDetectorWidth());
jTextFieldHeight = new JTextField("" + geometry.getDetectorHeight());
} else {
jTextFieldWidth = new JTextField("620");
jTextFieldHeight = new JTextField("480");
}
jTextFieldWidth.setHorizontalAlignment(JTextField.RIGHT);
jTextFieldHeight.setHorizontalAlignment(JTextField.RIGHT);
jButtonSShort = new JButton();
jButtonSShort.setText("Signed Short");
jButtonSShort.addActionListener(this);
jButtonSShort.setTransferHandler(th);
jTextFieldStack = new JTextField();
jTextFieldStack.setText("1");
jTextFieldStack.setHorizontalAlignment(JTextField.RIGHT);
getJOffset().setHorizontalAlignment(JTextField.RIGHT);
jLabel3 = new JLabel();
jLabel3.setText("Stack Size:");
getContentPane().add(jButtonSShort, new GridBagConstraints(0, 0, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jLabel1, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jLabel2, new GridBagConstraints(2, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jTextFieldWidth, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jTextFieldHeight, new GridBagConstraints(3, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jButtonDouble, new GridBagConstraints(0, 3, 4, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(getJOffset(), new GridBagConstraints(7, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(getJLabel4(), new GridBagConstraints(6, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jLabel3, new GridBagConstraints(4, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
getContentPane().add(jTextFieldStack, new GridBagConstraints(5, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
}
}
pack();
} catch(Exception e) {
e.printStackTrace();
}
}
public FileInfo getFileInfo(){
FileInfo fi = new FileInfo();
fi.fileFormat = FileInfo.RAW;
fi.fileType = FileInfo.GRAY8;
fi.height = Integer.parseInt(this.jTextFieldHeight.getText());
fi.width = Integer.parseInt(this.jTextFieldWidth.getText());
fi.nImages = Integer.parseInt(this.jTextFieldStack.getText());
fi.offset = Integer.parseInt(getJOffset().getText());
if (this.jButtonBig.isSelected()){
fi.intelByteOrder = false;
}
if (this.jButtonLittle.isSelected()){
fi.intelByteOrder = true;
}
if (this.jButtonShort.isSelected()){
fi.fileType=FileInfo.GRAY16_UNSIGNED;
}
if (this.jButtonSShort.isSelected()){
fi.fileType=FileInfo.GRAY16_SIGNED;
}
if (this.jButtonFloat.isSelected()){
fi.fileType=FileInfo.GRAY32_FLOAT;
}
if (this.jButtonDouble.isSelected()){
fi.fileType=FileInfo.GRAY64_FLOAT;
}
return fi;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() != null){
Object source = e.getSource();
if (source.equals(this.jButtonLittle)){
this.jButtonLittle.setSelected(true);
this.jButtonBig.setSelected(false);
}
if (source.equals(this.jButtonBig)){
this.jButtonLittle.setSelected(false);
this.jButtonBig.setSelected(true);
}
if (source.equals(this.jButtonShort)){
this.jButtonShort.setSelected(true);
this.jButtonSShort.setSelected(false);
this.jButtonFloat.setSelected(false);
this.jButtonDouble.setSelected(false);
}
if (source.equals(this.jButtonSShort)){
this.jButtonShort.setSelected(false);
this.jButtonSShort.setSelected(true);
this.jButtonFloat.setSelected(false);
this.jButtonDouble.setSelected(false);
}
if (source.equals(this.jButtonFloat)){
this.jButtonShort.setSelected(false);
this.jButtonSShort.setSelected(false);
this.jButtonFloat.setSelected(true);
this.jButtonDouble.setSelected(false);
}
if (source.equals(this.jButtonDouble)){
this.jButtonShort.setSelected(false);
this.jButtonSShort.setSelected(false);
this.jButtonFloat.setSelected(false);
this.jButtonDouble.setSelected(true);
}
}
}
public JButton getjButtonLittle() {
return jButtonLittle;
}
public void setjButtonLittle(JButton jButtonLittle) {
this.jButtonLittle = jButtonLittle;
}
public JButton getjButtonBig() {
return jButtonBig;
}
public void setjButtonBig(JButton jButtonBig) {
this.jButtonBig = jButtonBig;
}
public JButton getjButtonDouble() {
return jButtonDouble;
}
public void setjButtonDouble(JButton jButtonDouble) {
this.jButtonDouble = jButtonDouble;
}
public JButton getjButtonSShort() {
return jButtonSShort;
}
public void setjButtonSShort(JButton jButtonSShort) {
this.jButtonSShort = jButtonSShort;
}
public JButton getjButtonShort() {
return jButtonShort;
}
public void setjButtonShort(JButton jButtonShort) {
this.jButtonShort = jButtonShort;
}
public JButton getjButtonFloat() {
return jButtonFloat;
}
public void setjButtonFloat(JButton jButtonFloat) {
this.jButtonFloat = jButtonFloat;
}
private JTextField getJOffset() {
if(jOffset == null) {
jOffset = new JTextField();
jOffset.setText("0");
}
return jOffset;
}
private JLabel getJLabel4() {
if(jLabel4 == null) {
jLabel4 = new JLabel();
jLabel4.setText("Offset:");
}
return jLabel4;
}
}
/*
* Copyright (C) 2010-2014 - Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/