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