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}