source: josm/trunk/src/org/openstreetmap/josm/actions/GpxExportAction.java@ 1857

Last change on this file since 1857 was 1857, checked in by Gubaer, 15 years ago

replaced JOptionDialog.show... by OptionPaneUtil.show....
improved relation editor

  • Property svn:eol-style set to native
File size: 14.5 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.GridBagLayout;
7import java.awt.event.ActionEvent;
8import java.awt.event.ActionListener;
9import java.awt.event.KeyAdapter;
10import java.awt.event.KeyEvent;
11import java.io.File;
12import java.io.FileOutputStream;
13import java.io.IOException;
14import java.util.Calendar;
15
16import javax.swing.JButton;
17import javax.swing.JCheckBox;
18import javax.swing.JFileChooser;
19import javax.swing.JLabel;
20import javax.swing.JList;
21import javax.swing.JOptionPane;
22import javax.swing.JPanel;
23import javax.swing.JScrollPane;
24import javax.swing.JTextArea;
25import javax.swing.JTextField;
26import javax.swing.ListSelectionModel;
27
28import org.openstreetmap.josm.Main;
29import org.openstreetmap.josm.data.gpx.GpxData;
30import org.openstreetmap.josm.gui.ExtendedDialog;
31import org.openstreetmap.josm.gui.OptionPaneUtil;
32import org.openstreetmap.josm.gui.layer.GpxLayer;
33import org.openstreetmap.josm.gui.layer.Layer;
34import org.openstreetmap.josm.gui.layer.OsmDataLayer;
35import org.openstreetmap.josm.io.GpxWriter;
36import org.openstreetmap.josm.tools.GBC;
37import org.openstreetmap.josm.tools.Shortcut;
38
39/**
40 * Exports data to gpx.
41 */
42public class GpxExportAction extends DiskAccessAction {
43
44 private final static String warningGpl = "<html><font color='red' size='-2'>"+tr("Note: GPL is not compatible with the OSM license. Do not upload GPL licensed tracks.")+"</html>";
45
46 public GpxExportAction() {
47 super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
48 Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.GROUP_MENU));
49 }
50
51 protected GpxLayer getLayer() {
52 if (Main.map == null) return null;
53 if (Main.map.mapView == null) return null;
54 if (Main.map.mapView.getActiveLayer() == null) return null;
55 Layer layer = Main.map.mapView.getActiveLayer();
56 if (! (layer instanceof GpxLayer)) return null;
57 return (GpxLayer)layer;
58 }
59
60 public void actionPerformed(ActionEvent e) {
61 if (!isEnabled())
62 return;
63 GpxLayer layer = getLayer();
64 if (layer == null) {
65 OptionPaneUtil.showMessageDialog(
66 Main.parent,
67 tr("Nothing to export. Get some data first."),
68 tr("Information"),
69 JOptionPane.INFORMATION_MESSAGE
70 );
71 return;
72 }
73 export(layer);
74 }
75
76 /**
77 * Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
78 *
79 * <code>layer</code> must not be null. <code>layer</code> must be an instance of
80 * {@see OsmDataLayer} or {@see GpxLayer}.
81 *
82 * @param layer the layer
83 * @exception IllegalArgumentException thrown if layer is null
84 * @exception IllegalArgumentException thrown if layer is neither an instance of {@see OsmDataLayer}
85 * nor of {@see GpxLayer}
86 */
87 public void export(Layer layer) {
88 if (layer == null)
89 throw new IllegalArgumentException(tr("paramenter ''{0}'' must not be null", "layer"));
90 if (! (layer instanceof OsmDataLayer) && ! (layer instanceof GpxLayer))
91 throw new IllegalArgumentException(tr("expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", layer.getClass().getName()));
92
93 JFileChooser fc = createAndOpenFileChooser(false, false, null);
94 if (fc == null)
95 return;
96 File file = fc.getSelectedFile();
97 if (file == null)
98 return;
99
100 exportGpx(file, layer);
101 }
102
103 /**
104 * Exports a layer to a file.
105 *
106 * <code>layer</code> must not be null. <code>layer</code> must be an instance of
107 * {@see OsmDataLayer} or {@see GpxLayer}.
108 *
109 * @param layer the layer
110 * @exception IllegalArgumentException thrown if layer is null
111 * @exception IllegalArgumentException thrown if layer is neither an instance of {@see OsmDataLayer}
112 * nor of {@see GpxLayer}
113 */
114
115 public void exportGpx(File file, Layer layer) {
116 if (layer == null)
117 throw new IllegalArgumentException(tr("paramenter ''{0}'' must not be null", "layer"));
118 if (! (layer instanceof OsmDataLayer) && ! (layer instanceof GpxLayer))
119 throw new IllegalArgumentException(tr("expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", layer.getClass().getName()));
120 if (file == null)
121 throw new IllegalArgumentException(tr("paramenter ''{0}'' must not be null", "file"));
122
123 String fn = file.getPath();
124 if (fn.indexOf('.') == -1) {
125 fn += ".gpx";
126 file = new File(fn);
127 }
128
129 // open the dialog asking for options
130 JPanel p = new JPanel(new GridBagLayout());
131
132 p.add(new JLabel(tr("gps track description")), GBC.eol());
133 JTextArea desc = new JTextArea(3,40);
134 desc.setWrapStyleWord(true);
135 desc.setLineWrap(true);
136 p.add(new JScrollPane(desc), GBC.eop().fill(GBC.BOTH));
137
138 JCheckBox author = new JCheckBox(tr("Add author information"), Main.pref.getBoolean("lastAddAuthor", true));
139 author.setSelected(true);
140 p.add(author, GBC.eol());
141 JLabel nameLabel = new JLabel(tr("Real name"));
142 p.add(nameLabel, GBC.std().insets(10,0,5,0));
143 JTextField authorName = new JTextField(Main.pref.get("lastAuthorName"));
144 p.add(authorName, GBC.eol().fill(GBC.HORIZONTAL));
145 JLabel emailLabel = new JLabel(tr("E-Mail"));
146 p.add(emailLabel, GBC.std().insets(10,0,5,0));
147 JTextField email = new JTextField(Main.pref.get("osm-server.username"));
148 p.add(email, GBC.eol().fill(GBC.HORIZONTAL));
149 JLabel copyrightLabel = new JLabel(tr("Copyright (URL)"));
150 p.add(copyrightLabel, GBC.std().insets(10,0,5,0));
151 JTextField copyright = new JTextField();
152 p.add(copyright, GBC.std().fill(GBC.HORIZONTAL));
153 JButton predefined = new JButton(tr("Predefined"));
154 p.add(predefined, GBC.eol().insets(5,0,0,0));
155 JLabel copyrightYearLabel = new JLabel(tr("Copyright year"));
156 p.add(copyrightYearLabel, GBC.std().insets(10,0,5,5));
157 JTextField copyrightYear = new JTextField("");
158 p.add(copyrightYear, GBC.eol().fill(GBC.HORIZONTAL));
159 JLabel warning = new JLabel("<html><font size='-2'>&nbsp;</html");
160 p.add(warning, GBC.eol().fill(GBC.HORIZONTAL).insets(15,0,0,0));
161 addDependencies(author, authorName, email, copyright, predefined, copyrightYear, nameLabel, emailLabel, copyrightLabel, copyrightYearLabel, warning);
162
163 // if the user name is not the email address, but the osm user name
164 // move it from the email textfield to the author textfield
165 if(!email.getText().contains("@")) {
166 authorName.setText(email.getText());
167 email.setText("");
168 }
169
170 p.add(new JLabel(tr("Keywords")), GBC.eol());
171 JTextField keywords = new JTextField();
172 p.add(keywords, GBC.eop().fill(GBC.HORIZONTAL));
173
174 int answer = new ExtendedDialog(Main.parent,
175 tr("Export options"),
176 p,
177 new String[] {tr("Export and Save"), tr("Cancel")},
178 new String[] {"exportgpx.png", "cancel.png"}).getValue();
179 if (answer != 1)
180 return;
181
182 Main.pref.put("lastAddAuthor", author.isSelected());
183 if (authorName.getText().length() != 0) {
184 Main.pref.put("lastAuthorName", authorName.getText());
185 }
186 if (copyright.getText().length() != 0) {
187 Main.pref.put("lastCopyright", copyright.getText());
188 }
189
190 GpxData gpxData;
191 if (layer instanceof OsmDataLayer) {
192 gpxData = ((OsmDataLayer)layer).toGpxData();
193 } else if (layer instanceof GpxLayer) {
194 gpxData = ((GpxLayer)layer).data;
195 } else {
196 gpxData = OsmDataLayer.toGpxData(getCurrentDataSet(), file);
197 }
198
199 // add author and copyright details to the gpx data
200 if(author.isSelected()) {
201 if(authorName.getText().length() > 0) {
202 gpxData.attr.put(GpxData.META_AUTHOR_NAME, authorName.getText());
203 gpxData.attr.put(GpxData.META_COPYRIGHT_AUTHOR, authorName.getText());
204 }
205 if(email.getText().length() > 0) {
206 gpxData.attr.put(GpxData.META_AUTHOR_EMAIL, email.getText());
207 }
208 if(copyright.getText().length() > 0) {
209 gpxData.attr.put(GpxData.META_COPYRIGHT_LICENSE, copyright.getText());
210 }
211 if(copyrightYear.getText().length() > 0) {
212 gpxData.attr.put(GpxData.META_COPYRIGHT_YEAR, copyrightYear.getText());
213 }
214 }
215
216 // add the description to the gpx data
217 if(desc.getText().length() > 0) {
218 gpxData.attr.put(GpxData.META_DESC, desc.getText());
219 }
220
221 // add keywords to the gpx data
222 if(keywords.getText().length() > 0) {
223 gpxData.attr.put(GpxData.META_KEYWORDS, keywords.getText());
224 }
225
226 try {
227 FileOutputStream fo = new FileOutputStream(file);
228 new GpxWriter(fo).write(gpxData);
229 fo.flush();
230 fo.close();
231 } catch (IOException x) {
232 x.printStackTrace();
233 OptionPaneUtil.showMessageDialog(
234 Main.parent,
235 tr("Error while exporting {0}:\n{1}", fn,x.getMessage()),
236 tr("Error"),
237 JOptionPane.ERROR_MESSAGE
238 );
239 }
240 }
241
242 /**
243 * Add all those listeners to handle the enable state of the fields.
244 * @param copyrightYearLabel
245 * @param copyrightLabel
246 * @param emailLabel
247 * @param nameLabel
248 * @param warning
249 */
250 private static void addDependencies(
251 final JCheckBox author,
252 final JTextField authorName,
253 final JTextField email,
254 final JTextField copyright,
255 final JButton predefined,
256 final JTextField copyrightYear,
257 final JLabel nameLabel,
258 final JLabel emailLabel,
259 final JLabel copyrightLabel,
260 final JLabel copyrightYearLabel,
261 final JLabel warning) {
262
263 ActionListener authorActionListener = new ActionListener(){
264 public void actionPerformed(ActionEvent e) {
265 boolean b = author.isSelected();
266 authorName.setEnabled(b);
267 email.setEnabled(b);
268 nameLabel.setEnabled(b);
269 emailLabel.setEnabled(b);
270 authorName.setText(b ? Main.pref.get("lastAuthorName") : "");
271 email.setText(b ? Main.pref.get("osm-server.username") : "");
272
273 boolean authorSet = authorName.getText().length() != 0;
274 enableCopyright(copyright, predefined, copyrightYear, copyrightLabel, copyrightYearLabel, warning, b && authorSet);
275 }
276 };
277 author.addActionListener(authorActionListener);
278
279 KeyAdapter authorNameListener = new KeyAdapter(){
280 @Override public void keyReleased(KeyEvent e) {
281 boolean b = authorName.getText().length()!=0 && author.isSelected();
282 enableCopyright(copyright, predefined, copyrightYear, copyrightLabel, copyrightYearLabel, warning, b);
283 }
284 };
285 authorName.addKeyListener(authorNameListener);
286
287 predefined.addActionListener(new ActionListener(){
288 public void actionPerformed(ActionEvent e) {
289 JList l = new JList(new String[]{"Creative Commons By-SA", "public domain", "GNU Lesser Public License (LGPL)", "BSD License (MIT/X11)"});
290 l.setVisibleRowCount(4);
291 l.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
292 int answer = OptionPaneUtil.showConfirmationDialog(
293 Main.parent,
294 new JScrollPane(l),
295 tr("Choose a predefined license"),
296 JOptionPane.OK_CANCEL_OPTION,
297 JOptionPane.QUESTION_MESSAGE
298 );
299 if (answer != JOptionPane.OK_OPTION || l.getSelectedIndex() == -1)
300 return;
301 final String[] urls = {
302 "http://creativecommons.org/licenses/by-sa/2.5",
303 "public domain",
304 "http://www.gnu.org/copyleft/lesser.html",
305 "http://www.opensource.org/licenses/bsd-license.php"};
306 String license = "";
307 for (int i : l.getSelectedIndices()) {
308 if (i == 1) {
309 license = "public domain";
310 break;
311 }
312 license += license.length()==0 ? urls[i] : ", "+urls[i];
313 }
314 copyright.setText(license);
315 copyright.setCaretPosition(0);
316 }
317 });
318
319 authorActionListener.actionPerformed(null);
320 authorNameListener.keyReleased(null);
321 }
322
323 private static void enableCopyright(final JTextField copyright, final JButton predefined, final JTextField copyrightYear, final JLabel copyrightLabel, final JLabel copyrightYearLabel, final JLabel warning, boolean enable) {
324 copyright.setEnabled(enable);
325 predefined.setEnabled(enable);
326 copyrightYear.setEnabled(enable);
327 copyrightLabel.setEnabled(enable);
328 copyrightYearLabel.setEnabled(enable);
329 warning.setText(enable ? warningGpl : "<html><font size='-2'>&nbsp;</html");
330
331 if (enable && copyrightYear.getText().length()==0) {
332 copyrightYear.setText(enable ? Integer.toString(Calendar.getInstance().get(Calendar.YEAR)) : "");
333 } else if (!enable) {
334 copyrightYear.setText("");
335 }
336
337 if (enable && copyright.getText().length()==0) {
338 copyright.setText(enable ? Main.pref.get("lastCopyright", "http://creativecommons.org/licenses/by-sa/2.5") : "");
339 copyright.setCaretPosition(0);
340 } else if (!enable) {
341 copyright.setText("");
342 }
343 }
344
345 /**
346 * Refreshes the enabled state
347 *
348 */
349 @Override
350 protected void updateEnabledState() {
351 boolean check = Main.main != null
352 && Main.map != null
353 && Main.map.mapView !=null
354 && Main.map.mapView.getActiveLayer() != null;
355 if(!check) {
356 setEnabled(false);
357 return;
358 }
359 Layer layer = Main.map.mapView.getActiveLayer();
360 setEnabled(layer instanceof GpxLayer);
361 }
362}
Note: See TracBrowser for help on using the repository browser.