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

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

The newest version!
package com.lyonesgamer.propertygrid.properties;

import javax.swing.*;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import java.awt.*;
import java.util.*;
import java.util.List;

/**
 * Like StringProperty but uses * to hide value.
 *
 * @author Tristan Patch
 * @since 1.0
 */
public class PasswordProperty extends StringProperty {

    /**
     * The editor to use.
     */
    protected PasswordEditor editor = new PasswordEditor();

    /**
     * Creates a new property.
     *
     * @param name The name of the property in the grid.
     * @param value The initial value of the property.
     */
    public PasswordProperty(String name, String value) {
        super(name, value);
    }

    /**
     * Returns a string of equal length to the value, but with the value replaced with asterisks to protect the password.
     *
     * @param value The value to be converted to a string.
     * @return A protected string of the value.
     */
    @Override
    public String valueToString(String value) {
        return value.replaceAll(".", "*");
    }

    @Override
    public PGCellRenderer getRenderer() {
        return renderer;
    }

    @Override
    public PGCellEditor getEditor() {
        return editor;
    }

    protected class PasswordEditor extends JPasswordField implements PGCellEditor {

        //Unfortunately this code must be copied over line-by-line from StringEditor, because it needs to extend JPasswordField

        //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<>();

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            this.setText(valueToString(getValue()));
            return this;
        }

        @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() {
            onSetValue(new String(this.getPassword()));

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




© 2015 - 2024 Weber Informatics LLC | Privacy Policy