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}