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}