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 or a changeset URL."));
065            } else {
066                feedbackValid(tr("Please enter an integer value > 0 or a changeset URL."));
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                value = value.trim();
078                id = 0;
079                try {
080                    if (value.matches("http.*/changeset/[0-9]+")) {
081                        // full URL given, extract id
082                        value = value.substring(value.lastIndexOf('/') + 1);
083                    }
084
085                    int changesetId = Integer.parseInt(value);
086                    if (changesetId > 0) {
087                        id = changesetId;
088                        return true;
089                    }
090                } catch (NumberFormatException e) {
091                    // Ignored
092                    Logging.trace(e);
093                }
094            }
095            return false;
096        }
097    }
098}