001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs.changeset; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.Color; 007import java.awt.FlowLayout; 008import java.awt.event.ActionEvent; 009import java.util.Collections; 010 011import javax.swing.AbstractAction; 012import javax.swing.BorderFactory; 013import javax.swing.JButton; 014import javax.swing.JLabel; 015import javax.swing.JPanel; 016import javax.swing.event.DocumentEvent; 017import javax.swing.event.DocumentListener; 018 019import org.openstreetmap.josm.actions.downloadtasks.ChangesetContentDownloadTask; 020import org.openstreetmap.josm.gui.widgets.ChangesetIdTextField; 021import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator; 022import org.openstreetmap.josm.io.NetworkManager; 023import org.openstreetmap.josm.io.OnlineResource; 024import org.openstreetmap.josm.spi.preferences.Config; 025import org.openstreetmap.josm.tools.ImageProvider; 026 027/** 028 * This panel allows to enter the ID of single changeset and to download 029 * the respective changeset. 030 * @since 2689 031 */ 032public class SingleChangesetDownloadPanel extends JPanel { 033 034 private final ChangesetIdTextField tfChangesetId = new ChangesetIdTextField(); 035 036 /** 037 * Constructs a new {@link SingleChangesetDownloadPanel} 038 */ 039 public SingleChangesetDownloadPanel() { 040 build(); 041 } 042 043 protected void build() { 044 setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); 045 setBorder( 046 BorderFactory.createCompoundBorder( 047 BorderFactory.createLineBorder(Color.GRAY), 048 BorderFactory.createEmptyBorder(0, 3, 0, 3) 049 ) 050 ); 051 052 add(new JLabel(tr("Changeset ID: "))); 053 add(tfChangesetId); 054 tfChangesetId.setToolTipText(tr("Enter a changeset id")); 055 SelectAllOnFocusGainedDecorator.decorate(tfChangesetId); 056 057 DownloadAction actDownload = new DownloadAction(); 058 JButton btn = new JButton(actDownload); 059 tfChangesetId.addActionListener(actDownload); 060 tfChangesetId.getDocument().addDocumentListener(actDownload); 061 add(btn); 062 063 if (Config.getPref().getBoolean("downloadchangeset.autopaste", true)) { 064 tfChangesetId.tryToPasteFromClipboard(); 065 } 066 } 067 068 /** 069 * Replies the changeset id entered in this panel. 0 if no changeset id 070 * or an invalid changeset id is currently entered. 071 * 072 * @return the changeset id entered in this panel 073 */ 074 public int getChangesetId() { 075 return tfChangesetId.getChangesetId(); 076 } 077 078 /** 079 * Downloads the single changeset from the OSM API 080 */ 081 class DownloadAction extends AbstractAction implements DocumentListener { 082 083 DownloadAction() { 084 new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this); 085 putValue(SHORT_DESCRIPTION, tr("Download the changeset with the specified id, including the changeset content")); 086 updateEnabledState(); 087 } 088 089 @Override 090 public void actionPerformed(ActionEvent e) { 091 if (!isEnabled()) 092 return; 093 int id = getChangesetId(); 094 if (id == 0) 095 return; 096 ChangesetContentDownloadTask task = new ChangesetContentDownloadTask( 097 SingleChangesetDownloadPanel.this, 098 Collections.singleton(id) 099 ); 100 ChangesetCacheManager.getInstance().runDownloadTask(task); 101 } 102 103 protected void updateEnabledState() { 104 setEnabled(tfChangesetId.readIds() && !NetworkManager.isOffline(OnlineResource.OSM_API)); 105 } 106 107 @Override 108 public void changedUpdate(DocumentEvent e) { 109 updateEnabledState(); 110 } 111 112 @Override 113 public void insertUpdate(DocumentEvent e) { 114 updateEnabledState(); 115 } 116 117 @Override 118 public void removeUpdate(DocumentEvent e) { 119 updateEnabledState(); 120 } 121 } 122}