001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.dialogs.changeset;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Color;
007 import java.awt.FlowLayout;
008 import java.awt.event.ActionEvent;
009 import java.util.Collections;
010
011 import javax.swing.AbstractAction;
012 import javax.swing.BorderFactory;
013 import javax.swing.JLabel;
014 import javax.swing.JPanel;
015 import javax.swing.JTextField;
016 import javax.swing.event.DocumentEvent;
017 import javax.swing.event.DocumentListener;
018 import javax.swing.text.JTextComponent;
019
020 import org.openstreetmap.josm.gui.SideButton;
021 import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator;
022 import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
023 import org.openstreetmap.josm.tools.ImageProvider;
024
025 /**
026 * This panel allows to enter the ID of single changeset and to download
027 * the respective changeset.
028 *
029 */
030 public class SingleChangesetDownloadPanel extends JPanel {
031
032 private JTextField tfChangesetId;
033 private DownloadAction actDownload;
034 private ChangesetIdValidator valChangesetId;
035
036 protected void build() {
037 setLayout(new FlowLayout(FlowLayout.LEFT,0,0));
038 setBorder(
039 BorderFactory.createCompoundBorder(
040 BorderFactory.createLineBorder(Color.GRAY),
041 BorderFactory.createEmptyBorder(0,3,0,3)
042 )
043 );
044
045 add(new JLabel(tr("Changeset ID: ")));
046 add(tfChangesetId = new JTextField(10));
047 tfChangesetId.setToolTipText(tr("Enter a changeset id"));
048 valChangesetId =ChangesetIdValidator.decorate(tfChangesetId);
049 SelectAllOnFocusGainedDecorator.decorate(tfChangesetId);
050
051 actDownload = new DownloadAction();
052 SideButton btn = new SideButton(actDownload);
053 tfChangesetId.addActionListener(actDownload);
054 tfChangesetId.getDocument().addDocumentListener(actDownload);
055 add(btn);
056 }
057
058 public SingleChangesetDownloadPanel() {
059 build();
060 }
061
062 /**
063 * Replies the changeset id entered in this panel. 0 if no changeset id
064 * or an invalid changeset id is currently entered.
065 *
066 * @return the changeset id entered in this panel
067 */
068 public int getChangesetId() {
069 return valChangesetId.getChangesetId();
070 }
071
072 /**
073 * Downloads the single changeset from the OSM API
074 */
075 class DownloadAction extends AbstractAction implements DocumentListener{
076
077 public DownloadAction() {
078 putValue(SMALL_ICON, ImageProvider.get("dialogs/changeset", "downloadchangesetcontent"));
079 putValue(SHORT_DESCRIPTION, tr("Download the changeset with the specified id, including the changeset content"));
080 updateEnabledState();
081 }
082
083 public void actionPerformed(ActionEvent arg0) {
084 if (!isEnabled())
085 return;
086 int id = getChangesetId();
087 if (id == 0) return;
088 ChangesetContentDownloadTask task = new ChangesetContentDownloadTask(
089 SingleChangesetDownloadPanel.this,
090 Collections.singleton(id)
091 );
092 ChangesetCacheManager.getInstance().runDownloadTask(task);
093 }
094
095 protected void updateEnabledState() {
096 String v = tfChangesetId.getText();
097 if (v == null || v.trim().length() == 0) {
098 setEnabled(false);
099 return;
100 }
101 setEnabled(valChangesetId.isValid());
102 }
103
104 public void changedUpdate(DocumentEvent arg0) {
105 updateEnabledState();
106 }
107
108 public void insertUpdate(DocumentEvent arg0) {
109 updateEnabledState();
110 }
111
112 public void removeUpdate(DocumentEvent arg0) {
113 updateEnabledState();
114 }
115 }
116
117 /**
118 * Validator for a changeset ID entered in a {@link JTextComponent}.
119 *
120 */
121 static private class ChangesetIdValidator extends AbstractTextComponentValidator {
122 static public ChangesetIdValidator decorate(JTextComponent tc) {
123 return new ChangesetIdValidator(tc);
124 }
125
126 public ChangesetIdValidator(JTextComponent tc) {
127 super(tc);
128 }
129
130 @Override
131 public boolean isValid() {
132 String value = getComponent().getText();
133 if (value == null || value.trim().length() == 0)
134 return true;
135 return getChangesetId() > 0;
136 }
137
138 @Override
139 public void validate() {
140 if (!isValid()) {
141 feedbackInvalid(tr("The current value is not a valid changeset ID. Please enter an integer value > 0"));
142 } else {
143 feedbackValid(tr("Please enter an integer value > 0"));
144 }
145 }
146
147 public int getChangesetId() {
148 String value = getComponent().getText();
149 if (value == null || value.trim().length() == 0) return 0;
150 try {
151 int changesetId = Integer.parseInt(value.trim());
152 if (changesetId > 0) return changesetId;
153 return 0;
154 } catch(NumberFormatException e) {
155 return 0;
156 }
157 }
158 }
159 }