// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.dialogs.changeset; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.util.Collections; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.JTextComponent; import org.openstreetmap.josm.gui.SideButton; import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator; import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator; import org.openstreetmap.josm.tools.ImageProvider; /** * This panel allows to enter the ID of single changeset and to download * the respective changeset. * */ public class SingleChangesetDownloadPanel extends JPanel { private JTextField tfChangesetId; private DownloadAction actDownload; private ChangesetIdValidator valChangesetId; protected void build() { setLayout(new FlowLayout(FlowLayout.LEFT,0,0)); setBorder( BorderFactory.createCompoundBorder( BorderFactory.createLineBorder(Color.GRAY), BorderFactory.createEmptyBorder(0,3,0,3) ) ); add(new JLabel(tr("Changeset ID: "))); add(tfChangesetId = new JTextField(10)); tfChangesetId.setToolTipText(tr("Enter a changeset id")); valChangesetId =ChangesetIdValidator.decorate(tfChangesetId); SelectAllOnFocusGainedDecorator.decorate(tfChangesetId); actDownload = new DownloadAction(); SideButton btn = new SideButton(actDownload); tfChangesetId.addActionListener(actDownload); tfChangesetId.getDocument().addDocumentListener(actDownload); add(btn); } public SingleChangesetDownloadPanel() { build(); } /** * Replies the changeset id entered in this panel. 0 if no changeset id * or an invalid changeset id is currently entered. * * @return the changeset id entered in this panel */ public int getChangesetId() { return valChangesetId.getChangesetId(); } /** * Downloads the single changeset from the OSM API */ class DownloadAction extends AbstractAction implements DocumentListener{ public DownloadAction() { putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "downloadchangesetcontent")); putValue(SHORT_DESCRIPTION, tr("Download the changeset with the specified id, including the changeset content")); updateEnabledState(); } public void actionPerformed(ActionEvent arg0) { if (!isEnabled()) return; int id = getChangesetId(); if (id == 0) return; ChangesetContentDownloadTask task = new ChangesetContentDownloadTask( SingleChangesetDownloadPanel.this, Collections.singleton(id) ); ChangesetCacheManager.getInstance().runDownloadTask(task); } protected void updateEnabledState() { String v = tfChangesetId.getText(); if (v == null || v.trim().length() == 0) { setEnabled(false); return; } setEnabled(valChangesetId.isValid()); } public void changedUpdate(DocumentEvent arg0) { updateEnabledState(); } public void insertUpdate(DocumentEvent arg0) { updateEnabledState(); } public void removeUpdate(DocumentEvent arg0) { updateEnabledState(); } } /** * Validator for a changeset ID entered in a {@see JTextComponent}. * */ static private class ChangesetIdValidator extends AbstractTextComponentValidator { static public ChangesetIdValidator decorate(JTextComponent tc) { return new ChangesetIdValidator(tc); } public ChangesetIdValidator(JTextComponent tc) { super(tc); } @Override public boolean isValid() { String value = getComponent().getText(); if (value == null || value.trim().length() == 0) return true; return getChangesetId() > 0; } @Override public void validate() { if (!isValid()) { feedbackInvalid(tr("The current value is not a valid changeset ID. Please enter an integer value > 0")); } else { feedbackValid(tr("Please enter an integer value > 0")); } } public int getChangesetId() { String value = getComponent().getText(); if (value == null || value.trim().length() == 0) return 0; try { int changesetId = Integer.parseInt(value.trim()); if (changesetId > 0) return changesetId; return 0; } catch(NumberFormatException e) { return 0; } } } }