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}