001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.changeset.query;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import javax.swing.text.JTextComponent;
007
008import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator;
009import org.openstreetmap.josm.tools.Utils;
010
011/**
012 * Validator for user ids entered in a {@link JTextComponent}.
013 * @since 11326 (extracted from AdvancedChangesetQueryPanel)
014 */
015public class UidInputFieldValidator extends AbstractTextComponentValidator {
016
017    /**
018     * Constructs a new {@code TimeValidator} for the given text component.
019     * @param tc text component
020     */
021    public UidInputFieldValidator(JTextComponent tc) {
022        super(tc);
023    }
024
025    /**
026     * Decorates the given text component.
027     * @param tc text component to decorate
028     * @return new uid validator attached to {@code tc}
029     */
030    public static UidInputFieldValidator decorate(JTextComponent tc) {
031        return new UidInputFieldValidator(tc);
032    }
033
034    @Override
035    public boolean isValid() {
036        return getUid() > 0;
037    }
038
039    @Override
040    public void validate() {
041        String value = getComponent().getText();
042        if (Utils.isBlank(value)) {
043            feedbackInvalid("");
044            return;
045        }
046        try {
047            int uid = Integer.parseInt(value);
048            if (uid <= 0) {
049                feedbackInvalid(tr("The current value is not a valid user ID. Please enter an integer value > 0"));
050                return;
051            }
052        } catch (NumberFormatException e) {
053            feedbackInvalid(tr("The current value is not a valid user ID. Please enter an integer value > 0"));
054            return;
055        }
056        feedbackValid(tr("Please enter an integer value > 0"));
057    }
058
059    /**
060     * Returns the user identifier.
061     * @return the user identifier
062     */
063    public int getUid() {
064        String value = getComponent().getText();
065        if (Utils.isBlank(value)) return 0;
066        try {
067            int uid = Integer.parseInt(value.trim());
068            if (uid > 0)
069                return uid;
070            return 0;
071        } catch (NumberFormatException e) {
072            return 0;
073        }
074    }
075}