source: josm/trunk/src/org/openstreetmap/josm/io/GpxExporter.java@ 5361

Last change on this file since 5361 was 5361, checked in by Don-vip, 12 years ago

fix #7879 - Allow to open local and remote gzipped/bzipped osmChange files + remote osm.gz files + make some public constants of File filters to share between same importers/exporters

  • Property svn:eol-style set to native
File size: 12.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
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.text.MessageFormat;
15import java.util.Calendar;
16
17import javax.swing.JButton;
18import javax.swing.JCheckBox;
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.data.osm.DataSet;
31import org.openstreetmap.josm.gui.ExtendedDialog;
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.auth.CredentialsManager;
36import org.openstreetmap.josm.tools.CheckParameterUtil;
37import org.openstreetmap.josm.tools.GBC;
38
39public class GpxExporter extends FileExporter {
40 private final static String warningGpl = "<html><font color='red' size='-2'>"
41 + tr("Note: GPL is not compatible with the OSM license. Do not upload GPL licensed tracks.") + "</html>";
42
43 public GpxExporter() {
44 super(GpxImporter.FILE_FILTER);
45 }
46
47 @Override
48 public boolean acceptFile(File pathname, Layer layer) {
49 if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
50 return false;
51 return super.acceptFile(pathname, layer);
52 }
53
54 @Override
55 public void exportData(File file, Layer layer) throws IOException {
56 CheckParameterUtil.ensureParameterNotNull(layer, "layer");
57 if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
58 throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", layer
59 .getClass().getName()));
60 CheckParameterUtil.ensureParameterNotNull(file, "file");
61
62 String fn = file.getPath();
63 if (fn.indexOf('.') == -1) {
64 fn += ".gpx";
65 file = new File(fn);
66 }
67
68 // open the dialog asking for options
69 JPanel p = new JPanel(new GridBagLayout());
70
71 p.add(new JLabel(tr("GPS track description")), GBC.eol());
72 JTextArea desc = new JTextArea(3, 40);
73 desc.setWrapStyleWord(true);
74 desc.setLineWrap(true);
75 p.add(new JScrollPane(desc), GBC.eop().fill(GBC.BOTH));
76
77 JCheckBox author = new JCheckBox(tr("Add author information"), Main.pref.getBoolean("lastAddAuthor", true));
78 author.setSelected(true);
79 p.add(author, GBC.eol());
80 JLabel nameLabel = new JLabel(tr("Real name"));
81 p.add(nameLabel, GBC.std().insets(10, 0, 5, 0));
82 JTextField authorName = new JTextField(Main.pref.get("lastAuthorName"));
83 p.add(authorName, GBC.eol().fill(GBC.HORIZONTAL));
84 JLabel emailLabel = new JLabel(tr("E-Mail"));
85 p.add(emailLabel, GBC.std().insets(10, 0, 5, 0));
86 String user = CredentialsManager.getInstance().getUsername();
87 JTextField email = new JTextField(user == null ? "" : user);
88 p.add(email, GBC.eol().fill(GBC.HORIZONTAL));
89 JLabel copyrightLabel = new JLabel(tr("Copyright (URL)"));
90 p.add(copyrightLabel, GBC.std().insets(10, 0, 5, 0));
91 JTextField copyright = new JTextField();
92 p.add(copyright, GBC.std().fill(GBC.HORIZONTAL));
93 JButton predefined = new JButton(tr("Predefined"));
94 p.add(predefined, GBC.eol().insets(5, 0, 0, 0));
95 JLabel copyrightYearLabel = new JLabel(tr("Copyright year"));
96 p.add(copyrightYearLabel, GBC.std().insets(10, 0, 5, 5));
97 JTextField copyrightYear = new JTextField("");
98 p.add(copyrightYear, GBC.eol().fill(GBC.HORIZONTAL));
99 JLabel warning = new JLabel("<html><font size='-2'>&nbsp;</html");
100 p.add(warning, GBC.eol().fill(GBC.HORIZONTAL).insets(15, 0, 0, 0));
101 addDependencies(author, authorName, email, copyright, predefined, copyrightYear, nameLabel, emailLabel,
102 copyrightLabel, copyrightYearLabel, warning);
103
104 // if the user name is not the email address, but the osm user name
105 // move it from the email textfield to the author textfield
106 if (!email.getText().contains("@")) {
107 authorName.setText(email.getText());
108 email.setText("");
109 }
110
111 p.add(new JLabel(tr("Keywords")), GBC.eol());
112 JTextField keywords = new JTextField();
113 p.add(keywords, GBC.eop().fill(GBC.HORIZONTAL));
114
115 ExtendedDialog ed = new ExtendedDialog(Main.parent,
116 tr("Export options"),
117 new String[] { tr("Export and Save"), tr("Cancel") });
118 ed.setButtonIcons(new String[] { "exportgpx.png", "cancel.png" });
119 ed.setContent(p);
120 ed.showDialog();
121
122 if (ed.getValue() != 1)
123 return;
124
125 Main.pref.put("lastAddAuthor", author.isSelected());
126 if (authorName.getText().length() != 0) {
127 Main.pref.put("lastAuthorName", authorName.getText());
128 }
129 if (copyright.getText().length() != 0) {
130 Main.pref.put("lastCopyright", copyright.getText());
131 }
132
133 GpxData gpxData;
134 if (layer instanceof OsmDataLayer) {
135 gpxData = ((OsmDataLayer) layer).toGpxData();
136 } else if (layer instanceof GpxLayer) {
137 gpxData = ((GpxLayer) layer).data;
138 } else {
139 gpxData = OsmDataLayer.toGpxData(getCurrentDataSet(), file);
140 }
141
142 // add author and copyright details to the gpx data
143 if (author.isSelected()) {
144 if (authorName.getText().length() > 0) {
145 gpxData.attr.put(GpxData.META_AUTHOR_NAME, authorName.getText());
146 gpxData.attr.put(GpxData.META_COPYRIGHT_AUTHOR, authorName.getText());
147 }
148 if (email.getText().length() > 0) {
149 gpxData.attr.put(GpxData.META_AUTHOR_EMAIL, email.getText());
150 }
151 if (copyright.getText().length() > 0) {
152 gpxData.attr.put(GpxData.META_COPYRIGHT_LICENSE, copyright.getText());
153 }
154 if (copyrightYear.getText().length() > 0) {
155 gpxData.attr.put(GpxData.META_COPYRIGHT_YEAR, copyrightYear.getText());
156 }
157 }
158
159 // add the description to the gpx data
160 if (desc.getText().length() > 0) {
161 gpxData.attr.put(GpxData.META_DESC, desc.getText());
162 }
163
164 // add keywords to the gpx data
165 if (keywords.getText().length() > 0) {
166 gpxData.attr.put(GpxData.META_KEYWORDS, keywords.getText());
167 }
168
169 try {
170 FileOutputStream fo = new FileOutputStream(file);
171 new GpxWriter(fo).write(gpxData);
172 fo.flush();
173 fo.close();
174 } catch (IOException x) {
175 x.printStackTrace();
176 JOptionPane.showMessageDialog(Main.parent, tr("Error while exporting {0}:\n{1}", fn, x.getMessage()),
177 tr("Error"), JOptionPane.ERROR_MESSAGE);
178 }
179
180 }
181
182 private static void enableCopyright(final JTextField copyright, final JButton predefined,
183 final JTextField copyrightYear, final JLabel copyrightLabel, final JLabel copyrightYearLabel,
184 final JLabel warning, boolean enable) {
185 copyright.setEnabled(enable);
186 predefined.setEnabled(enable);
187 copyrightYear.setEnabled(enable);
188 copyrightLabel.setEnabled(enable);
189 copyrightYearLabel.setEnabled(enable);
190 warning.setText(enable ? warningGpl : "<html><font size='-2'>&nbsp;</html");
191
192 if (enable && copyrightYear.getText().length()==0) {
193 copyrightYear.setText(enable ? Integer.toString(Calendar.getInstance().get(Calendar.YEAR)) : "");
194 } else if (!enable) {
195 copyrightYear.setText("");
196 }
197
198 if (enable && copyright.getText().length()==0) {
199 copyright.setText(enable ? Main.pref.get("lastCopyright", "http://creativecommons.org/licenses/by-sa/2.5") : "");
200 copyright.setCaretPosition(0);
201 } else if (!enable) {
202 copyright.setText("");
203 }
204 }
205
206 /**
207 * Add all those listeners to handle the enable state of the fields.
208 * @param copyrightYearLabel
209 * @param copyrightLabel
210 * @param emailLabel
211 * @param nameLabel
212 * @param warning
213 */
214 private static void addDependencies(
215 final JCheckBox author,
216 final JTextField authorName,
217 final JTextField email,
218 final JTextField copyright,
219 final JButton predefined,
220 final JTextField copyrightYear,
221 final JLabel nameLabel,
222 final JLabel emailLabel,
223 final JLabel copyrightLabel,
224 final JLabel copyrightYearLabel,
225 final JLabel warning) {
226
227 ActionListener authorActionListener = new ActionListener(){
228 public void actionPerformed(ActionEvent e) {
229 boolean b = author.isSelected();
230 authorName.setEnabled(b);
231 email.setEnabled(b);
232 nameLabel.setEnabled(b);
233 emailLabel.setEnabled(b);
234 authorName.setText(b ? Main.pref.get("lastAuthorName") : "");
235 String user = CredentialsManager.getInstance().getUsername();
236 email.setText(b ? (user == null ? "" : user) : "");
237
238 boolean authorSet = authorName.getText().length() != 0;
239 GpxExporter.enableCopyright(copyright, predefined, copyrightYear, copyrightLabel, copyrightYearLabel, warning, b && authorSet);
240 }
241 };
242 author.addActionListener(authorActionListener);
243
244 KeyAdapter authorNameListener = new KeyAdapter(){
245 @Override public void keyReleased(KeyEvent e) {
246 boolean b = authorName.getText().length()!=0 && author.isSelected();
247 GpxExporter.enableCopyright(copyright, predefined, copyrightYear, copyrightLabel, copyrightYearLabel, warning, b);
248 }
249 };
250 authorName.addKeyListener(authorNameListener);
251
252 predefined.addActionListener(new ActionListener(){
253 public void actionPerformed(ActionEvent e) {
254 final String[] licenses = {
255 "Creative Commons By-SA",
256 "Open Database License (ODbL)",
257 "public domain",
258 "GNU Lesser Public License (LGPL)",
259 "BSD License (MIT/X11)"};
260 JList l = new JList(licenses);
261 l.setVisibleRowCount(licenses.length);
262 l.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
263 int answer = JOptionPane.showConfirmDialog(
264 Main.parent,
265 new JScrollPane(l),
266 tr("Choose a predefined license"),
267 JOptionPane.OK_CANCEL_OPTION,
268 JOptionPane.QUESTION_MESSAGE
269 );
270 if (answer != JOptionPane.OK_OPTION || l.getSelectedIndex() == -1)
271 return;
272 final String[] urls = {
273 "http://creativecommons.org/licenses/by-sa/2.5",
274 "http://opendatacommons.org/licenses/odbl/1.0",
275 "public domain",
276 "http://www.gnu.org/copyleft/lesser.html",
277 "http://www.opensource.org/licenses/bsd-license.php"};
278 String license = "";
279 for (int i : l.getSelectedIndices()) {
280 if (i == 2) {
281 license = "public domain";
282 break;
283 }
284 license += license.length()==0 ? urls[i] : ", "+urls[i];
285 }
286 copyright.setText(license);
287 copyright.setCaretPosition(0);
288 }
289 });
290
291 authorActionListener.actionPerformed(null);
292 authorNameListener.keyReleased(null);
293 }
294
295 /**
296 * Replies the current dataset
297 *
298 * @return the current dataset. null, if no current dataset exists
299 */
300 private DataSet getCurrentDataSet() {
301 return Main.main.getCurrentDataSet();
302 }
303
304}
Note: See TracBrowser for help on using the repository browser.