source: josm/trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java@ 6883

Last change on this file since 6883 was 6830, checked in by Don-vip, 10 years ago

javadoc fixes for jdk8 compatibility

  • Property svn:eol-style set to native
File size: 7.0 KB
Line 
1//License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.io.File;
8import java.io.IOException;
9import java.util.Collection;
10import java.util.LinkedList;
11import java.util.List;
12
13import javax.swing.JFileChooser;
14import javax.swing.JOptionPane;
15import javax.swing.filechooser.FileFilter;
16
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.gui.ExtendedDialog;
19import org.openstreetmap.josm.gui.layer.Layer;
20import org.openstreetmap.josm.gui.layer.OsmDataLayer;
21import org.openstreetmap.josm.io.FileExporter;
22import org.openstreetmap.josm.tools.Shortcut;
23
24public abstract class SaveActionBase extends DiskAccessAction {
25 private File file;
26
27 public SaveActionBase(String name, String iconName, String tooltip, Shortcut shortcut) {
28 super(name, iconName, tooltip, shortcut);
29 }
30
31 @Override
32 public void actionPerformed(ActionEvent e) {
33 if (!isEnabled())
34 return;
35 boolean saved = doSave();
36 if (saved) {
37 addToFileOpenHistory();
38 }
39 }
40
41 public boolean doSave() {
42 if (Main.isDisplayingMapView()) {
43 Layer layer = Main.map.mapView.getActiveLayer();
44 if (layer != null && layer.isSavable()) {
45 return doSave(layer);
46 }
47 }
48 return false;
49 }
50
51 public boolean doSave(Layer layer) {
52 if(!layer.checkSaveConditions())
53 return false;
54 file = getFile(layer);
55 return doInternalSave(layer, file);
56 }
57
58 public static boolean doSave(Layer layer, File file) {
59 if(!layer.checkSaveConditions())
60 return false;
61 return doInternalSave(layer, file);
62 }
63
64 private static boolean doInternalSave(Layer layer, File file) {
65 if (file == null)
66 return false;
67
68 try {
69 boolean exported = false;
70 boolean canceled = false;
71 for (FileExporter exporter : ExtensionFileFilter.exporters) {
72 if (exporter.acceptFile(file, layer)) {
73 exporter.exportData(file, layer);
74 exported = true;
75 canceled = exporter.isCanceled();
76 break;
77 }
78 }
79 if (!exported) {
80 JOptionPane.showMessageDialog(Main.parent, tr("No Exporter found! Nothing saved."), tr("Warning"),
81 JOptionPane.WARNING_MESSAGE);
82 return false;
83 } else if (canceled) {
84 return false;
85 }
86 layer.setName(file.getName());
87 layer.setAssociatedFile(file);
88 if (layer instanceof OsmDataLayer) {
89 ((OsmDataLayer) layer).onPostSaveToFile();
90 }
91 Main.parent.repaint();
92 } catch (IOException e) {
93 Main.error(e);
94 return false;
95 }
96 return true;
97 }
98
99 protected abstract File getFile(Layer layer);
100
101 /**
102 * Refreshes the enabled state
103 *
104 */
105 @Override
106 protected void updateEnabledState() {
107 if (Main.applet) {
108 setEnabled(false);
109 return;
110 }
111 boolean check = Main.isDisplayingMapView()
112 && Main.map.mapView.getActiveLayer() != null;
113 if(!check) {
114 setEnabled(false);
115 return;
116 }
117 Layer layer = Main.map.mapView.getActiveLayer();
118 setEnabled(layer != null && layer.isSavable());
119 }
120
121 /**
122 * Creates a new "Save" dialog for a single {@link ExtensionFileFilter} and makes it visible.<br>
123 * When the user has chosen a file, checks the file extension, and confirms overwrite if needed.
124 *
125 * @param title The dialog title
126 * @param filter The dialog file filter
127 * @return The output {@code File}
128 * @since 5456
129 * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
130 */
131 public static File createAndOpenSaveFileChooser(String title, ExtensionFileFilter filter) {
132 JFileChooser fc = createAndOpenFileChooser(false, false, title, filter, JFileChooser.FILES_ONLY, null);
133 return checkFileAndConfirmOverWrite(fc, filter.getDefaultExtension());
134 }
135
136 /**
137 * Creates a new "Save" dialog for a given file extension and makes it visible.<br>
138 * When the user has chosen a file, checks the file extension, and confirms overwrite if needed.
139 *
140 * @param title The dialog title
141 * @param extension The file extension
142 * @return The output {@code File}
143 * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, String)
144 */
145 public static File createAndOpenSaveFileChooser(String title, String extension) {
146 JFileChooser fc = createAndOpenFileChooser(false, false, title, extension);
147 return checkFileAndConfirmOverWrite(fc, extension);
148 }
149
150 private static File checkFileAndConfirmOverWrite(JFileChooser fc, String extension) {
151 if (fc == null) return null;
152 File file = fc.getSelectedFile();
153
154 FileFilter ff = fc.getFileFilter();
155 if (!ff.accept(file)) {
156 // Extension of another filefilter given ?
157 for (FileFilter cff : fc.getChoosableFileFilters()) {
158 if (cff.accept(file)) {
159 fc.setFileFilter(cff);
160 return file;
161 }
162 }
163 // No filefilter accepts current filename, add default extension
164 String fn = file.getPath();
165 if (ff instanceof ExtensionFileFilter) {
166 fn += "." + ((ExtensionFileFilter)ff).getDefaultExtension();
167 } else if (extension != null) {
168 fn += "." + extension;
169 }
170 file = new File(fn);
171 if (!confirmOverwrite(file))
172 return null;
173 }
174 return file;
175 }
176
177 public static boolean confirmOverwrite(File file) {
178 if (file == null || (file.exists())) {
179 ExtendedDialog dialog = new ExtendedDialog(
180 Main.parent,
181 tr("Overwrite"),
182 new String[] {tr("Overwrite"), tr("Cancel")}
183 );
184 dialog.setContent(tr("File exists. Overwrite?"));
185 dialog.setButtonIcons(new String[] {"save_as.png", "cancel.png"});
186 dialog.showDialog();
187 return (dialog.getValue() == 1);
188 }
189 return true;
190 }
191
192 protected void addToFileOpenHistory() {
193 String filepath;
194 try {
195 filepath = file.getCanonicalPath();
196 } catch (IOException ign) {
197 return;
198 }
199
200 int maxsize = Math.max(0, Main.pref.getInteger("file-open.history.max-size", 15));
201 Collection<String> oldHistory = Main.pref.getCollection("file-open.history");
202 List<String> history = new LinkedList<String>(oldHistory);
203 history.remove(filepath);
204 history.add(0, filepath);
205 Main.pref.putCollectionBounded("file-open.history", maxsize, history);
206 }
207}
Note: See TracBrowser for help on using the repository browser.