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