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

Revision 4483, 12.5 KB checked in by Don-vip, 8 months ago (diff)

GPX export: Add ODbL 1.0 in licenses preset

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