001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.widgets;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import javax.swing.text.JTextComponent;
007
008import org.openstreetmap.josm.tools.Logging;
009
010/**
011 * A text field designed to enter a single OSM changeset ID.
012 * @since 5765
013 */
014public class ChangesetIdTextField extends AbstractIdTextField<ChangesetIdTextField.ChangesetIdValidator> {
015
016    /**
017     * Constructs a new {@link ChangesetIdTextField}
018     */
019    public ChangesetIdTextField() {
020        super(ChangesetIdValidator.class, 10);
021    }
022
023    /**
024     * Gets the entered changeset id.
025     * @return The entered changeset id
026     */
027    public final int getChangesetId() {
028        return validator.id;
029    }
030
031    /**
032     * Reads the changeset id.
033     * @return true if a valid changeset id has been successfully read, false otherwise
034     * @see ChangesetIdValidator#readChangesetId
035     */
036    @Override
037    public boolean readIds() {
038        return validator.readChangesetId();
039    }
040
041    /**
042     * Validator for a changeset ID entered in a {@link JTextComponent}.
043     */
044    public static class ChangesetIdValidator extends AbstractTextComponentValidator {
045
046        private int id;
047
048        /**
049         * Constructs a new {@link ChangesetIdValidator}
050         * @param tc The text component to validate
051         */
052        public ChangesetIdValidator(JTextComponent tc) {
053            super(tc);
054        }
055
056        @Override
057        public boolean isValid() {
058            return readChangesetId();
059        }
060
061        @Override
062        public void validate() {
063            if (!isValid()) {
064                feedbackInvalid(tr("The current value is not a valid changeset ID. Please enter an integer value > 0"));
065            } else {
066                feedbackValid(tr("Please enter an integer value > 0"));
067            }
068        }
069
070        /**
071         * Reads the changeset id.
072         * @return true if a valid changeset id has been successfully read, false otherwise
073         */
074        public boolean readChangesetId() {
075            String value = getComponent().getText();
076            if (value != null && !value.trim().isEmpty()) {
077                id = 0;
078                try {
079                    int changesetId = Integer.parseInt(value.trim());
080                    if (changesetId > 0) {
081                        id = changesetId;
082                        return true;
083                    }
084                } catch (NumberFormatException e) {
085                    // Ignored
086                    Logging.trace(e);
087                }
088            }
089            return false;
090        }
091    }
092}