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