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