source: josm/trunk/src/org/openstreetmap/josm/actions/OverpassDownloadAction.java@ 8744

Last change on this file since 8744 was 8744, checked in by simon04, 9 years ago

see #11428 - Refactoring (class/package structure)

File size: 7.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.Component;
8import java.awt.event.ActionEvent;
9import java.awt.event.KeyEvent;
10import java.util.ArrayList;
11import java.util.Arrays;
12import java.util.Collections;
13import java.util.concurrent.Future;
14
15import javax.swing.AbstractAction;
16import javax.swing.JButton;
17import javax.swing.JLabel;
18import javax.swing.JOptionPane;
19import javax.swing.JPanel;
20import javax.swing.JScrollPane;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
24import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
25import org.openstreetmap.josm.data.Bounds;
26import org.openstreetmap.josm.data.preferences.CollectionProperty;
27import org.openstreetmap.josm.data.preferences.StringProperty;
28import org.openstreetmap.josm.gui.HelpAwareOptionPane;
29import org.openstreetmap.josm.gui.download.DownloadDialog;
30import org.openstreetmap.josm.gui.util.GuiHelper;
31import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
32import org.openstreetmap.josm.gui.widgets.JosmTextArea;
33import org.openstreetmap.josm.io.OverpassDownloadReader;
34import org.openstreetmap.josm.tools.GBC;
35import org.openstreetmap.josm.tools.OverpassTurboQueryWizard;
36import org.openstreetmap.josm.tools.Shortcut;
37import org.openstreetmap.josm.tools.Utils;
38
39/**
40 * Download map data from Overpass API server.
41 * @since 8684
42 */
43public class OverpassDownloadAction extends JosmAction {
44
45 /**
46 * Constructs a new {@code OverpassDownloadAction}.
47 */
48 public OverpassDownloadAction() {
49 super(tr("Download from Overpass API ..."), "download-overpass", tr("Download map data from Overpass API server."),
50 // CHECKSTYLE.OFF: LineLength
51 Shortcut.registerShortcut("file:download-overpass", tr("File: {0}", tr("Download from Overpass API ...")), KeyEvent.VK_DOWN, Shortcut.ALT_SHIFT),
52 // CHECKSTYLE.ON: LineLength
53 true, "overpassdownload/download", true);
54 putValue("help", ht("/Action/OverpassDownload"));
55 }
56
57 @Override
58 public void actionPerformed(ActionEvent e) {
59 OverpassDownloadDialog dialog = OverpassDownloadDialog.getInstance();
60 dialog.restoreSettings();
61 dialog.setVisible(true);
62 if (!dialog.isCanceled()) {
63 dialog.rememberSettings();
64 Bounds area = dialog.getSelectedDownloadArea();
65 DownloadOsmTask task = new DownloadOsmTask();
66 Future<?> future = task.download(
67 new OverpassDownloadReader(area, dialog.getOverpassServer(), dialog.getOverpassQuery()),
68 dialog.isNewLayerRequired(), area, null);
69 Main.worker.submit(new PostDownloadHandler(task, future));
70 }
71 }
72
73 static final class OverpassDownloadDialog extends DownloadDialog {
74
75 protected HistoryComboBox overpassServer;
76 protected HistoryComboBox overpassWizard;
77 protected JosmTextArea overpassQuery;
78 private static OverpassDownloadDialog instance;
79 static final StringProperty OVERPASS_SERVER = new StringProperty("download.overpass.server", "http://overpass-api.de/api/");
80 static final CollectionProperty OVERPASS_SERVER_HISTORY = new CollectionProperty("download.overpass.servers",
81 Arrays.asList("http://overpass-api.de/api/", "http://overpass.osm.rambler.ru/cgi/"));
82 static final CollectionProperty OVERPASS_WIZARD_HISTORY = new CollectionProperty("download.overpass.wizard", new ArrayList<String>());
83
84 private OverpassDownloadDialog(Component parent) {
85 super(parent, ht("/Action/OverpassDownload"));
86 cbDownloadOsmData.setEnabled(false);
87 cbDownloadOsmData.setSelected(false);
88 cbDownloadGpxData.setVisible(false);
89 cbDownloadNotes.setVisible(false);
90 cbStartup.setVisible(false);
91 }
92
93 public static OverpassDownloadDialog getInstance() {
94 if (instance == null) {
95 instance = new OverpassDownloadDialog(Main.parent);
96 }
97 return instance;
98 }
99
100 @Override
101 protected void buildMainPanelAboveDownloadSelections(JPanel pnl) {
102
103 pnl.add(new JLabel(), GBC.eol()); // needed for the invisible checkboxes cbDownloadGpxData, cbDownloadNotes
104
105 final String tooltip = tr("Builds an Overpass query using the Overpass Turbo query wizard");
106 overpassWizard = new HistoryComboBox();
107 overpassWizard.setToolTipText(tooltip);
108 final JButton buildQuery = new JButton(tr("Build query"));
109 buildQuery.addActionListener(new AbstractAction() {
110 @Override
111 public void actionPerformed(ActionEvent e) {
112 final String overpassWizardText = overpassWizard.getText();
113 try {
114 overpassQuery.setText(OverpassTurboQueryWizard.getInstance().constructQuery(overpassWizardText));
115 } catch (OverpassTurboQueryWizard.ParseException ex) {
116 HelpAwareOptionPane.showOptionDialog(
117 Main.parent,
118 tr("<html>The Overpass wizard could not parse the following query:"
119 + Utils.joinAsHtmlUnorderedList(Collections.singleton(overpassWizardText))),
120 tr("Parse error"),
121 JOptionPane.ERROR_MESSAGE,
122 null
123 );
124 }
125 }
126 });
127 buildQuery.setToolTipText(tooltip);
128 pnl.add(buildQuery, GBC.std().insets(5, 5, 5, 5));
129 pnl.add(overpassWizard, GBC.eol().fill(GBC.HORIZONTAL));
130
131 overpassQuery = new JosmTextArea("", 8, 80);
132 overpassQuery.setFont(GuiHelper.getMonospacedFont(overpassQuery));
133 JScrollPane scrollPane = new JScrollPane(overpassQuery);
134 pnl.add(new JLabel(tr("Overpass query: ")), GBC.std().insets(5, 5, 5, 5));
135 GBC gbc = GBC.eol().fill(GBC.HORIZONTAL);
136 gbc.ipady = 200;
137 pnl.add(scrollPane, gbc);
138
139 overpassServer = new HistoryComboBox();
140 pnl.add(new JLabel(tr("Overpass server: ")), GBC.std().insets(5, 5, 5, 5));
141 pnl.add(overpassServer, GBC.eol().fill(GBC.HORIZONTAL));
142
143 }
144
145 public String getOverpassServer() {
146 return overpassServer.getText();
147 }
148
149 public String getOverpassQuery() {
150 return overpassQuery.getText();
151 }
152
153 @Override
154 public void restoreSettings() {
155 super.restoreSettings();
156 overpassServer.setPossibleItems(OVERPASS_SERVER_HISTORY.get());
157 overpassServer.setText(OVERPASS_SERVER.get());
158 overpassWizard.setPossibleItems(OVERPASS_WIZARD_HISTORY.get());
159 }
160
161 @Override
162 public void rememberSettings() {
163 super.rememberSettings();
164 overpassWizard.addCurrentItemToHistory();
165 OVERPASS_SERVER.put(getOverpassServer());
166 OVERPASS_SERVER_HISTORY.put(overpassServer.getHistory());
167 OVERPASS_WIZARD_HISTORY.put(overpassWizard.getHistory());
168 }
169
170 }
171
172}
Note: See TracBrowser for help on using the repository browser.