com.lyonesgamer.propertygrid.properties.FileProperty Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JPropertyGrid Show documentation
Show all versions of JPropertyGrid Show documentation
A property editor component for Swing.
The newest version!
package com.lyonesgamer.propertygrid.properties;
import com.lyonesgamer.propertygrid.PGProperty;
import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.List;
/**
* A property to select a single file.
*
* @author Tristan Patch
* @since 1.0
*/
public class FileProperty extends PGProperty {
/**
* The value of this property.
*/
protected File value;
/**
* The filter used when selecting a file.
*/
protected FileFilter filter;
/**
* The editor to use.
*/
protected FileEditor editor = new FileEditor();
/**
* The renderer to use.
*/
protected FileRenderer renderer = new FileRenderer();
/**
* Creates a new property.
*
* @param name The name of the property in the grid.
* @param value The initial value of the property. May be invalid.
*/
public FileProperty(String name, String value) {
super(name);
this.value = new File(value);
}
/**
* Creates a new property.
*
* @param name The name of the property in the grid.
* @param value The initial value of the property. May not exist.
*/
public FileProperty(String name, File value) {
super(name);
this.value = value;
}
/**
* Getter for the file filter.
* @return The filter used when selecting a file.
*/
public FileFilter getFilter() {
return filter;
}
/**
* Setter for the file filter.
* @param filter The filter used when selecting a file.
*/
public void setFilter(FileFilter filter) {
this.filter = filter;
}
@Override
protected void doAfterAdded() {}
/**
* Validates the file. Currently returns true until a good validation method can be decided.
*
* @param value The value to be validated.
* @return Whether the value is a valid value for this property.
*/
@Override
public boolean onValidateValue(File value) {
return true; //TODO: Decide on criteria for validation
}
@Override
public void onSetValue(File value) {
if (parent != null)
parent.firePropertyChangeEvent(this, value);
this.value = value;
}
/**
* Converts this string to a file property. The file may potentially not exist or be unreadable.
*
* @param value The string to attempt to set from.
*/
@Override
public void setValueFromString(String value) {
setValue(new File(value));
}
@Override
public void setValueFromLong(long value) {}
@Override
public File getValue() {
return value;
}
@Override
public File stringToValue(String value) {
return new File(value);
}
@Override
public File longToValue(long value) {
return null;
}
/**
* If the value is a file that exist, returns the path to the file.
*
* @param value The value to convert.
* @return The canonical path of the file, or an empty string if it's invalid.
*/
@Override
public String valueToString(File value) {
try {
if (value.exists())
return value.getCanonicalPath();
else
return "";
} catch (IOException e) {
return "";
}
}
@Override
public PGCellRenderer getRenderer() {
return renderer;
}
@Override
public PGCellEditor getEditor() {
return editor;
}
protected class FileEditor extends JLabel implements PGCellEditor {
//No need to use an EventListenerList if we only have one listener type
protected final List listeners = new ArrayList<>();
protected final Set listenersToRemove = new HashSet<>();
protected final JFileChooser fileChooser;
public FileEditor() {
fileChooser = new JFileChooser();
fileChooser.setFileFilter(filter);
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
createDialog();
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.setText(valueToString(getValue()));
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
createDialog();
}
});
return this;
}
public void createDialog() {
fileChooser.setCurrentDirectory(value.getParentFile());
int result = fileChooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION)
onSetValue(fileChooser.getSelectedFile());
fireEditingStopped();
}
@Override
public Object getCellEditorValue() {
return valueToString(getValue());
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return !disabled;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
@Override
public void cancelCellEditing() {
fireEditingCancelled();
}
public void fireEditingCancelled() {
ChangeEvent event = new ChangeEvent(this);
for (CellEditorListener l : listeners)
l.editingCanceled(event);
doClearListeners();
}
public void fireEditingStopped() {
ChangeEvent event = new ChangeEvent(this);
for (CellEditorListener l : listeners)
l.editingStopped(event);
doClearListeners();
}
@Override
public void addCellEditorListener(CellEditorListener l) {
listeners.add(l);
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
listenersToRemove.add(l);
}
protected void doClearListeners() {
listeners.removeAll(listenersToRemove);
listenersToRemove.clear();
}
}
protected class FileRenderer extends JLabel implements PGCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
setText(valueToString(getValue()));
setToolTipText(helpString);
return this;
}
}
}