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

Last change on this file since 1574 was 1574, checked in by stoecker, 15 years ago

close #2214 - patch by Henrik Niehaus - GPX export metadata handling

  • Property svn:eol-style set to native
File size: 11.4 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.layer.GpxLayer;
32import org.openstreetmap.josm.gui.layer.Layer;
33import org.openstreetmap.josm.gui.layer.OsmDataLayer;
34import org.openstreetmap.josm.io.GpxWriter;
35import org.openstreetmap.josm.tools.GBC;
36import org.openstreetmap.josm.tools.Shortcut;
37
38/**
39 * Exports data to gpx.
40 */
41public class GpxExportAction extends DiskAccessAction {
42
43 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>";
44
45 private final Layer layer;
46
47 public GpxExportAction(Layer layer) {
48 super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
49 Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.GROUP_MENU));
50 this.layer = layer;
51 }
52
53 public void actionPerformed(ActionEvent e) {
54 if (layer == null && Main.map == null) {
55 JOptionPane.showMessageDialog(Main.parent, tr("Nothing to export. Get some data first."));
56 return;
57 }
58
59 JFileChooser fc = createAndOpenFileChooser(false, false, null);
60 if (fc == null)
61 return;
62 File file = fc.getSelectedFile();
63 if (file == null)
64 return;
65
66 exportGpx(file, this.layer == null ? Main.main.editLayer() : this.layer);
67 }
68
69 public static void exportGpx(File file, Layer layer) {
70 String fn = file.getPath();
71 if (fn.indexOf('.') == -1) {
72 fn += ".gpx";
73 file = new File(fn);
74 }
75
76 // open the dialog asking for options
77 JPanel p = new JPanel(new GridBagLayout());
78
79 p.add(new JLabel(tr("gps track description")), GBC.eol());
80 JTextArea desc = new JTextArea(3,40);
81 desc.setWrapStyleWord(true);
82 desc.setLineWrap(true);
83 p.add(new JScrollPane(desc), GBC.eop().fill(GBC.BOTH));
84
85 JCheckBox author = new JCheckBox(tr("Add author information"), Main.pref.getBoolean("lastAddAuthor", true));
86 author.setSelected(true);
87 p.add(author, GBC.eol());
88 JLabel nameLabel = new JLabel(tr("Real name"));
89 p.add(nameLabel, GBC.std().insets(10,0,5,0));
90 JTextField authorName = new JTextField(Main.pref.get("lastAuthorName"));
91 p.add(authorName, GBC.eol().fill(GBC.HORIZONTAL));
92 JLabel emailLabel = new JLabel(tr("Email"));
93 p.add(emailLabel, GBC.std().insets(10,0,5,0));
94 JTextField email = new JTextField(Main.pref.get("osm-server.username"));
95 p.add(email, GBC.eol().fill(GBC.HORIZONTAL));
96 JLabel copyrightLabel = new JLabel(tr("Copyright (URL)"));
97 p.add(copyrightLabel, GBC.std().insets(10,0,5,0));
98 JTextField copyright = new JTextField();
99 p.add(copyright, GBC.std().fill(GBC.HORIZONTAL));
100 JButton predefined = new JButton(tr("Predefined"));
101 p.add(predefined, GBC.eol().insets(5,0,0,0));
102 JLabel copyrightYearLabel = new JLabel(tr("Copyright year"));
103 p.add(copyrightYearLabel, GBC.std().insets(10,0,5,5));
104 JTextField copyrightYear = new JTextField("");
105 p.add(copyrightYear, GBC.eol().fill(GBC.HORIZONTAL));
106 JLabel warning = new JLabel("<html><font size='-2'>&nbsp;</html");
107 p.add(warning, GBC.eol().fill(GBC.HORIZONTAL).insets(15,0,0,0));
108 addDependencies(author, authorName, email, copyright, predefined, copyrightYear, nameLabel, emailLabel, copyrightLabel, copyrightYearLabel, warning);
109
110 // if the user name is not the email address, but the osm user name
111 // move it from the email textfield to the author textfield
112 if(!email.getText().contains("@")) {
113 authorName.setText(email.getText());
114 email.setText("");
115 }
116
117 p.add(new JLabel(tr("Keywords")), GBC.eol());
118 JTextField keywords = new JTextField();
119 p.add(keywords, GBC.eop().fill(GBC.HORIZONTAL));
120
121 int answer = new ExtendedDialog(Main.parent,
122 tr("Export options"),
123 p,
124 new String[] {tr("Export and Save"), tr("Cancel")},
125 new String[] {"exportgpx.png", "cancel.png"}).getValue();
126 if (answer != 1)
127 return;
128
129 Main.pref.put("lastAddAuthor", author.isSelected());
130 if (authorName.getText().length() != 0)
131 Main.pref.put("lastAuthorName", authorName.getText());
132 if (copyright.getText().length() != 0)
133 Main.pref.put("lastCopyright", copyright.getText());
134
135 GpxData gpxData;
136 if (layer instanceof OsmDataLayer)
137 gpxData = ((OsmDataLayer)layer).toGpxData();
138 else if (layer instanceof GpxLayer)
139 gpxData = ((GpxLayer)layer).data;
140 else
141 gpxData = OsmDataLayer.toGpxData(Main.ds, file);
142
143 // add author and copyright details to the gpx data
144 if(author.isSelected()) {
145 if(authorName.getText().length() > 0) {
146 gpxData.attr.put(GpxData.META_AUTHOR_NAME, authorName.getText());
147 gpxData.attr.put(GpxData.META_COPYRIGHT_AUTHOR, authorName.getText());
148 }
149 if(email.getText().length() > 0) gpxData.attr.put(GpxData.META_AUTHOR_EMAIL, email.getText());
150 if(copyright.getText().length() > 0) gpxData.attr.put(GpxData.META_COPYRIGHT_LICENSE, copyright.getText());
151 if(copyrightYear.getText().length() > 0) gpxData.attr.put(GpxData.META_COPYRIGHT_YEAR, copyrightYear.getText());
152 }
153
154 // add the description to the gpx data
155 if(desc.getText().length() > 0) gpxData.attr.put(GpxData.META_DESC, desc.getText());
156
157 // add keywords to the gpx data
158 if(keywords.getText().length() > 0) gpxData.attr.put(GpxData.META_KEYWORDS, keywords.getText());
159
160 try {
161 FileOutputStream fo = new FileOutputStream(file);
162 new GpxWriter(fo).write(gpxData);
163 fo.flush();
164 fo.close();
165 } catch (IOException x) {
166 x.printStackTrace();
167 JOptionPane.showMessageDialog(Main.parent, tr("Error while exporting {0}:\n{1}", fn,x.getMessage()), tr("Error"), JOptionPane.ERROR_MESSAGE);
168 }
169 }
170
171 /**
172 * Add all those listeners to handle the enable state of the fields.
173 * @param copyrightYearLabel
174 * @param copyrightLabel
175 * @param emailLabel
176 * @param nameLabel
177 * @param warning
178 */
179 private static void addDependencies(
180 final JCheckBox author,
181 final JTextField authorName,
182 final JTextField email,
183 final JTextField copyright,
184 final JButton predefined,
185 final JTextField copyrightYear,
186 final JLabel nameLabel,
187 final JLabel emailLabel,
188 final JLabel copyrightLabel,
189 final JLabel copyrightYearLabel,
190 final JLabel warning) {
191
192 ActionListener authorActionListener = new ActionListener(){
193 public void actionPerformed(ActionEvent e) {
194 boolean b = author.isSelected();
195 authorName.setEnabled(b);
196 email.setEnabled(b);
197 nameLabel.setEnabled(b);
198 emailLabel.setEnabled(b);
199 authorName.setText(b ? Main.pref.get("lastAuthorName") : "");
200 email.setText(b ? Main.pref.get("osm-server.username") : "");
201
202 boolean authorSet = authorName.getText().length() != 0;
203 enableCopyright(copyright, predefined, copyrightYear, copyrightLabel, copyrightYearLabel, warning, b && authorSet);
204 }
205 };
206 author.addActionListener(authorActionListener);
207
208 KeyAdapter authorNameListener = new KeyAdapter(){
209 @Override public void keyReleased(KeyEvent e) {
210 boolean b = authorName.getText().length()!=0 && author.isSelected();
211 enableCopyright(copyright, predefined, copyrightYear, copyrightLabel, copyrightYearLabel, warning, b);
212 }
213 };
214 authorName.addKeyListener(authorNameListener);
215
216 predefined.addActionListener(new ActionListener(){
217 public void actionPerformed(ActionEvent e) {
218 JList l = new JList(new String[]{"Creative Commons By-SA", "public domain", "GNU Lesser Public License (LGPL)", "BSD License (MIT/X11)"});
219 l.setVisibleRowCount(4);
220 l.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
221 int answer = JOptionPane.showConfirmDialog(Main.parent, new JScrollPane(l),tr("Choose a predefined license"), JOptionPane.OK_CANCEL_OPTION);
222 if (answer != JOptionPane.OK_OPTION || l.getSelectedIndex() == -1)
223 return;
224 final String[] urls = {
225 "http://creativecommons.org/licenses/by-sa/2.5",
226 "public domain",
227 "http://www.gnu.org/copyleft/lesser.html",
228 "http://www.opensource.org/licenses/bsd-license.php"};
229 String license = "";
230 for (int i : l.getSelectedIndices()) {
231 if (i == 1) {
232 license = "public domain";
233 break;
234 }
235 license += license.length()==0 ? urls[i] : ", "+urls[i];
236 }
237 copyright.setText(license);
238 copyright.setCaretPosition(0);
239 }
240 });
241
242 authorActionListener.actionPerformed(null);
243 authorNameListener.keyReleased(null);
244 }
245
246 private static void enableCopyright(final JTextField copyright, final JButton predefined, final JTextField copyrightYear, final JLabel copyrightLabel, final JLabel copyrightYearLabel, final JLabel warning, boolean enable) {
247 copyright.setEnabled(enable);
248 predefined.setEnabled(enable);
249 copyrightYear.setEnabled(enable);
250 copyrightLabel.setEnabled(enable);
251 copyrightYearLabel.setEnabled(enable);
252 warning.setText(enable ? warningGpl : "<html><font size='-2'>&nbsp;</html");
253
254 if (enable && copyrightYear.getText().length()==0) {
255 copyrightYear.setText(enable ? Integer.toString(Calendar.getInstance().get(Calendar.YEAR)) : "");
256 } else if (!enable)
257 copyrightYear.setText("");
258
259 if (enable && copyright.getText().length()==0) {
260 copyright.setText(enable ? Main.pref.get("lastCopyright", "http://creativecommons.org/licenses/by-sa/2.5") : "");
261 copyright.setCaretPosition(0);
262 } else if (!enable)
263 copyright.setText("");
264 }
265}
Note: See TracBrowser for help on using the repository browser.