source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java@ 2689

Last change on this file since 2689 was 2689, checked in by Gubaer, 16 years ago

new: Changeset Cache Manager for querying, downloading, browsing, and managing changesets within JOSM. See also Changeset Manager and Changeset Query Dialog

File size: 7.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.changeset.query;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Dimension;
7import java.awt.GridBagConstraints;
8import java.awt.GridBagLayout;
9import java.awt.Insets;
10import java.awt.event.FocusAdapter;
11import java.awt.event.FocusEvent;
12import java.net.MalformedURLException;
13import java.net.URL;
14
15import javax.swing.BorderFactory;
16import javax.swing.JLabel;
17import javax.swing.JPanel;
18import javax.swing.JTextField;
19import javax.swing.event.DocumentEvent;
20import javax.swing.event.DocumentListener;
21import javax.swing.event.HyperlinkEvent;
22import javax.swing.event.HyperlinkListener;
23
24import org.openstreetmap.josm.gui.widgets.HtmlPanel;
25import org.openstreetmap.josm.io.ChangesetQuery;
26import org.openstreetmap.josm.io.OsmApi;
27import org.openstreetmap.josm.io.ChangesetQuery.ChangesetQueryUrlException;
28import org.openstreetmap.josm.tools.ImageProvider;
29
30
31public class UrlBasedQueryPanel extends JPanel {
32
33 private JTextField tfUrl;
34 private JLabel lblValid;
35
36 protected JPanel buildURLPanel() {
37 JPanel pnl = new JPanel(new GridBagLayout());
38 GridBagConstraints gc = new GridBagConstraints();
39 gc.weightx = 0.0;
40 gc.fill = GridBagConstraints.HORIZONTAL;
41 gc.insets = new Insets(0,0,0,5);
42 pnl.add(new JLabel(tr("URL: ")), gc);
43
44 gc.gridx = 1;
45 gc.weightx = 1.0;
46 gc.fill = GridBagConstraints.HORIZONTAL;
47 pnl.add(tfUrl = new JTextField(), gc);
48 tfUrl.getDocument().addDocumentListener(new ChangetQueryUrlValidator());
49 tfUrl.addFocusListener(
50 new FocusAdapter() {
51 @Override
52 public void focusGained(FocusEvent e) {
53 tfUrl.selectAll();
54 }
55 }
56 );
57
58 gc.gridx = 2;
59 gc.weightx = 0.0;
60 gc.fill = GridBagConstraints.HORIZONTAL;
61 pnl.add(lblValid = new JLabel(), gc);
62 lblValid.setPreferredSize(new Dimension(20,20));
63 return pnl;
64 }
65
66 protected JPanel buildHelpPanel() {
67 HtmlPanel pnl = new HtmlPanel();
68 pnl.setText(
69 tr("<html><body>Please enter or paste an URL to retrieve changesets from the OSM API."
70 + "<p><strong>Examples</strong></p>"
71 + "<ul>"
72 + "<li><a href=\"http://www.openstreetmap.org/browse/changesets?open=true\">http://www.openstreetmap.org/browse/changesets?open=true</a></li>"
73 + "<li><a href=\"http://api.openstreetmap.org/api/0.6/changesets?open=true\">http://api.openstreetmap.org/api/0.6/changesets?open=true</a></li>"
74 + "</ul>"
75 + "Note that changeset queries are currently always submitted to ''{0}'', regardless of the "
76 + "host, port and path of the URL entered beow."
77 + "</body></html>",
78 OsmApi.getOsmApi().getBaseUrl()
79 )
80 );
81 pnl.getEditorPane().addHyperlinkListener(
82 new HyperlinkListener() {
83 public void hyperlinkUpdate(HyperlinkEvent e) {
84 if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
85 tfUrl.setText(e.getDescription());
86 tfUrl.requestFocusInWindow();
87 }
88 }
89 }
90 );
91 return pnl;
92 }
93
94 protected ChangesetQuery buildChangesetQueryFromUrlQuery(String query) {
95 if (query == null)
96 return new ChangesetQuery();
97 query = query.trim();
98 return null;
99 }
100
101 protected void build() {
102 setLayout(new GridBagLayout());
103 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
104
105 GridBagConstraints gc = new GridBagConstraints();
106 gc.weightx = 1.0;
107 gc.fill = GridBagConstraints.HORIZONTAL;
108 gc.insets = new Insets(0,0,10,0);
109 add(buildHelpPanel(),gc);
110
111 gc.gridy = 1;
112 gc.weightx = 1.0;
113 gc.fill = GridBagConstraints.HORIZONTAL;
114 add(buildURLPanel(),gc);
115
116 gc.gridy = 2;
117 gc.weightx = 1.0;
118 gc.weighty = 1.0;
119 gc.fill = GridBagConstraints.BOTH;
120 add(new JPanel(),gc);
121
122 }
123 public UrlBasedQueryPanel() {
124 build();
125 }
126
127 protected boolean isValidChangesetQueryUrl(String text) {
128 return buildChangesetQuery(text) != null;
129 }
130
131 protected ChangesetQuery buildChangesetQuery(String text) {
132 URL url = null;
133 try {
134 url = new URL(text);
135 } catch(MalformedURLException e) {
136 return null;
137 }
138 String path = url.getPath();
139 String query = url.getQuery();
140 if (path == null || ! path.endsWith("/changesets")) return null;
141
142 try {
143 return ChangesetQuery.buildFromUrlQuery(query);
144 } catch(ChangesetQueryUrlException e) {
145 return null;
146 }
147 }
148
149 /**
150 * Replies the {@see ChangesetQuery} specified in this panel. null, if no valid changeset query
151 * is specified.
152 *
153 * @return the changeset query
154 */
155 public ChangesetQuery buildChangesetQuery() {
156 String value = tfUrl.getText().trim();
157 return buildChangesetQuery(value);
158 }
159
160 public void startUserInput() {
161 tfUrl.requestFocusInWindow();
162 }
163
164 /**
165 * Validates text entered in the changeset query URL field on the fly
166 */
167 class ChangetQueryUrlValidator implements DocumentListener {
168 protected String getCurrentFeedback() {
169 String fb = (String)lblValid.getClientProperty("valid");
170 return fb == null ? "none" : fb;
171 }
172 protected void feedbackValid() {
173 if (getCurrentFeedback().equals("valid")) return;
174 lblValid.setIcon(ImageProvider.get("dialogs/changeset", "valid"));
175 lblValid.setToolTipText("");
176 lblValid.putClientProperty("valid", "valid");
177 }
178
179 protected void feedbackInvalid() {
180 if (getCurrentFeedback().equals("invalid")) return;
181 lblValid.setIcon(ImageProvider.get("warning-small"));
182 lblValid.setToolTipText(tr("This changeset query URL is invalid"));
183 lblValid.putClientProperty("valid", "invalid");
184 }
185
186 protected void feedbackNone() {
187 lblValid.setIcon(null);
188 lblValid.putClientProperty("valid", "none");
189 }
190
191 protected void validate() {
192 String value = tfUrl.getText();
193 if (value.trim().equals("")) {
194 feedbackNone();
195 return;
196 }
197 value = value.trim();
198 if (isValidChangesetQueryUrl(value)) {
199 feedbackValid();
200 } else {
201 feedbackInvalid();
202 }
203 }
204 public void changedUpdate(DocumentEvent e) {
205 validate();
206 }
207
208 public void insertUpdate(DocumentEvent e) {
209 validate();
210 }
211
212 public void removeUpdate(DocumentEvent e) {
213 validate();
214 }
215 }
216}
Note: See TracBrowser for help on using the repository browser.