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