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

Last change on this file since 729 was 693, checked in by stoecker, 16 years ago

Save dialog now distinguish between OSM and GPX. Saving OSM layer as GPX is still possible. Closes #836

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