All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.lyonesgamer.propertygrid.properties.FileProperty Maven / Gradle / Ivy

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;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy