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

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

fixed #1647 - patch by dmuecke - Improve export

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