package automenta.vivisect.swing.property.sheet.editor;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import automenta.vivisect.swing.property.beans.editor.AbstractPropertyEditor;
import automenta.vivisect.swing.property.sheet.I18N;
import automenta.vivisect.swing.property.swing.UserPreferences;
/**
* File editor.
*
* @author Bartosz Firyn (SarXos)
*/
public class FileEditor extends AbstractPropertyEditor {
protected class FileEditorComponent extends JPanel {
private static final long serialVersionUID = 411604969565728959L;
private JTextField textfield = null;
private JButton button = null;
private JButton cancelButton = null;
public FileEditorComponent() {
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
textfield = new JTextField();
textfield.setEditable(false);
textfield.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2));
textfield.setTransferHandler(new FileTransferHandler());
textfield.setAlignmentX(JTextField.LEFT_ALIGNMENT);
textfield.setBackground(UIManager.getColor("Table.selectionBackground"));
textfield.setForeground(UIManager.getColor("Table.selectionForeground"));
Dimension size = new Dimension(24, 15);
Image file = null;
Image reset = null;
try {
file = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/l2fprod/common/propertysheet/icons/file.png"));
reset = ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/l2fprod/common/propertysheet/icons/reset.png"));
} catch (IOException e) {
throw new RuntimeException("Cannot load resource", e);
}
button = new JButton();
button.setPreferredSize(size);
button.setSize(size);
button.setMaximumSize(size);
button.setMinimumSize(size);
button.setAction(new AbstractAction("", new ImageIcon(file)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selectFile();
}
});
cancelButton = new JButton();
cancelButton.setPreferredSize(size);
cancelButton.setSize(size);
cancelButton.setMaximumSize(size);
cancelButton.setMinimumSize(size);
cancelButton.setAction(new AbstractAction("", new ImageIcon(reset)) {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
selectNull();
}
});
JPanel container = new JPanel();
container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
container.add(button);
container.add(cancelButton);
container.setPreferredSize(new Dimension(size.width * 2, 25));
container.setAlignmentX(JPanel.RIGHT_ALIGNMENT);
add(textfield, BorderLayout.WEST);
add(container, BorderLayout.CENTER);
}
public void setText(String text) {
textfield.setText(text);
}
public String getText() {
return textfield.getText().trim();
}
public void setFile(File file) {
setText(file.getAbsolutePath());
}
public File getFile() {
String file = getText();
if ("".equals(file)) {
return null;
} else {
return new File(file);
}
}
}
private class FileTransferHandler extends TransferHandler {
private static final long serialVersionUID = 7574211768508397674L;
@Override
public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
for (int i = 0, c = transferFlavors.length; i < c; i++) {
if (transferFlavors[i].equals(DataFlavor.javaFileListFlavor)) {
return true;
}
}
return false;
}
@Override
public boolean importData(JComponent comp, Transferable t) {
try {
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>) t.getTransferData(DataFlavor.javaFileListFlavor);
if (list.size() > 0) {
File oldFile = (File) getValue();
File newFile = (File) list.get(0);
fileEditor.setFile(newFile);
firePropertyChange(oldFile, newFile);
}
} catch (Exception e) {
throw new RuntimeException("Cannot import data", e);
}
return true;
}
}
protected FileEditorComponent fileEditor = null;
public FileEditor() {
editor = fileEditor = new FileEditorComponent();
}
@Override
public Object getValue() {
return fileEditor.getFile();
}
protected void selectNull() {
Object oldFile = getValue();
fileEditor.setText("");
firePropertyChange(oldFile, null);
}
@Override
public void setValue(Object value) {
if (value instanceof File) {
fileEditor.setFile((File) value);
} else {
fileEditor.setText("");
}
}
protected void selectFile() {
JFileChooser chooser = UserPreferences.getDefaultFileChooser();
chooser.setDialogTitle(I18N.CHOOSE_FILE);
chooser.setApproveButtonText(I18N.SELECT);
if (chooser.showOpenDialog(editor) == JFileChooser.APPROVE_OPTION) {
File oldFile = (File) getValue();
File newFile = chooser.getSelectedFile();
fileEditor.setFile(newFile);
firePropertyChange(oldFile, newFile);
}
}
}