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;
022import org.openstreetmap.josm.io.OnlineResource;
023
024/**
025 * This panel allows to enter the ID of single changeset and to download
026 * the respective changeset.
027 *
028 */
029public class SingleChangesetDownloadPanel extends JPanel {
030
031    private ChangesetIdTextField tfChangesetId;
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        DownloadAction 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        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() && !Main.isOffline(OnlineResource.OSM_API));
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}