source: josm/src/org/openstreetmap/josm/actions/SaveAction.java@ 54

Last change on this file since 54 was 54, checked in by imi, 18 years ago
  • fixed: Saving of new objects with properties in OSM format did not work
  • Open/Save dialogs now remember the "current" directory for the session
  • added a warning before overwriting files
File size: 3.4 KB
Line 
1package org.openstreetmap.josm.actions;
2
3import java.awt.event.ActionEvent;
4import java.awt.event.InputEvent;
5import java.awt.event.KeyEvent;
6import java.io.File;
7import java.io.FileWriter;
8import java.io.IOException;
9
10import javax.swing.JFileChooser;
11import javax.swing.JOptionPane;
12import javax.swing.KeyStroke;
13import javax.swing.filechooser.FileFilter;
14
15import org.openstreetmap.josm.Main;
16import org.openstreetmap.josm.data.osm.OsmPrimitive;
17import org.openstreetmap.josm.io.GpxWriter;
18import org.openstreetmap.josm.io.OsmWriter;
19
20/**
21 * Export the data as OSM intern xml file.
22 *
23 * TODO: This is very redundant with SaveGpxAction. Merge both actions into one!
24 *
25 * @author imi
26 */
27public class SaveAction extends JosmAction {
28
29 /**
30 * Construct the action with "Save" as label.
31 */
32 public SaveAction() {
33 super("Save", "save", "Save the current data.", null, KeyStroke.getAWTKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
34 }
35
36 public void actionPerformed(ActionEvent event) {
37 if (Main.main.getMapFrame() == null) {
38 JOptionPane.showMessageDialog(Main.main, "No document open so nothing to save.");
39 return;
40 }
41 if (isDataSetEmpty() && JOptionPane.NO_OPTION == JOptionPane.showConfirmDialog(Main.main, "The document contains no data. Save anyway?", "Empty document", JOptionPane.YES_NO_OPTION))
42 return;
43
44 JFileChooser fc = new JFileChooser(Main.main.currentDirectory);
45 for (int i = 0; i < ExtensionFileFilter.filters.length; ++i)
46 fc.addChoosableFileFilter(ExtensionFileFilter.filters[i]);
47 fc.setAcceptAllFileFilterUsed(true);
48 fc.showSaveDialog(Main.main);
49 File file = fc.getSelectedFile();
50 if (file == null)
51 return;
52 Main.main.currentDirectory = fc.getCurrentDirectory();
53 if (file.exists() && JOptionPane.YES_OPTION !=
54 JOptionPane.showConfirmDialog(Main.main, "File exists. Overwrite?", "Overwrite", JOptionPane.YES_NO_OPTION))
55 return;
56
57 try {
58 String fn = file.getPath();
59 if (fn.indexOf('.') == -1) {
60 FileFilter ff = fc.getFileFilter();
61 if (ff instanceof ExtensionFileFilter) {
62 fn = fn + "." + ((ExtensionFileFilter)ff).defaultExtension;
63 file = new File(fn);
64 }
65 }
66 FileWriter fileWriter;
67 if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn))
68 new GpxWriter(fileWriter = new FileWriter(file), Main.main.ds).output();
69 else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn))
70 new OsmWriter(fileWriter = new FileWriter(file), Main.main.ds).output();
71 else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
72 JOptionPane.showMessageDialog(Main.main, "CSV output not supported yet.");
73 return;
74 } else {
75 JOptionPane.showMessageDialog(Main.main, "Unknown file extension.");
76 return;
77 }
78 fileWriter.close();
79 Main.main.getMapFrame().mapView.editLayer().cleanData(null, false);
80 } catch (IOException e) {
81 e.printStackTrace();
82 JOptionPane.showMessageDialog(Main.main, "An error occoured while saving.\n"+e.getMessage());
83 }
84 }
85
86 /**
87 * Check the data set if it would be empty on save. It is empty, if it contains
88 * no objects (after all objects that are created and deleted without beeing
89 * transfered to the server have been removed).
90 *
91 * @return <code>true</code>, if a save result in an empty data set.
92 */
93 private boolean isDataSetEmpty() {
94 for (OsmPrimitive osm : Main.main.ds.allPrimitives())
95 if (!osm.isDeleted() || osm.id > 0)
96 return false;
97 return true;
98 }
99
100}
Note: See TracBrowser for help on using the repository browser.