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}