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

Last change on this file since 6327 was 6069, checked in by stoecker, 11 years ago

see #8853 remove tabs, trailing spaces, windows line ends, strange characters

  • Property svn:eol-style set to native
File size: 6.9 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.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 for (FileExporter exporter : ExtensionFileFilter.exporters) {
71 if (exporter.acceptFile(file, layer)) {
72 exporter.exportData(file, layer);
73 exported = true;
74 break;
75 }
76 }
77 if (!exported) {
78 JOptionPane.showMessageDialog(Main.parent, tr("No Exporter found! Nothing saved."), tr("Warning"),
79 JOptionPane.WARNING_MESSAGE);
80 return false;
81 }
82 layer.setName(file.getName());
83 layer.setAssociatedFile(file);
84 if (layer instanceof OsmDataLayer) {
85 ((OsmDataLayer) layer).onPostSaveToFile();
86 }
87 Main.parent.repaint();
88 } catch (IOException e) {
89 e.printStackTrace();
90 return false;
91 }
92 return true;
93 }
94
95 protected abstract File getFile(Layer layer);
96
97 /**
98 * Refreshes the enabled state
99 *
100 */
101 @Override
102 protected void updateEnabledState() {
103 if (Main.applet) {
104 setEnabled(false);
105 return;
106 }
107 boolean check = Main.isDisplayingMapView()
108 && Main.map.mapView.getActiveLayer() != null;
109 if(!check) {
110 setEnabled(false);
111 return;
112 }
113 Layer layer = Main.map.mapView.getActiveLayer();
114 setEnabled(layer != null && layer.isSavable());
115 }
116
117 /**
118 * Creates a new "Save" dialog for a single {@link ExtensionFileFilter} and makes it visible.<br/>
119 * When the user has chosen a file, checks the file extension, and confirms overwrite if needed.
120 *
121 * @param title The dialog title
122 * @param filter The dialog file filter
123 * @return The output {@code File}
124 * @since 5456
125 * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, FileFilter, int, String)
126 */
127 public static File createAndOpenSaveFileChooser(String title, ExtensionFileFilter filter) {
128 JFileChooser fc = createAndOpenFileChooser(false, false, title, filter, JFileChooser.FILES_ONLY, null);
129 return checkFileAndConfirmOverWrite(fc, filter.getDefaultExtension());
130 }
131
132 /**
133 * Creates a new "Save" dialog for a given file extension and makes it visible.<br/>
134 * When the user has chosen a file, checks the file extension, and confirms overwrite if needed.
135 *
136 * @param title The dialog title
137 * @param extension The file extension
138 * @return The output {@code File}
139 * @see DiskAccessAction#createAndOpenFileChooser(boolean, boolean, String, String)
140 */
141 public static File createAndOpenSaveFileChooser(String title, String extension) {
142 JFileChooser fc = createAndOpenFileChooser(false, false, title, extension);
143 return checkFileAndConfirmOverWrite(fc, extension);
144 }
145
146 private static File checkFileAndConfirmOverWrite(JFileChooser fc, String extension) {
147 if (fc == null) return null;
148 File file = fc.getSelectedFile();
149
150 FileFilter ff = fc.getFileFilter();
151 if (!ff.accept(file)) {
152 // Extension of another filefilter given ?
153 for (FileFilter cff : fc.getChoosableFileFilters()) {
154 if (cff.accept(file)) {
155 fc.setFileFilter(cff);
156 return file;
157 }
158 }
159 // No filefilter accepts current filename, add default extension
160 String fn = file.getPath();
161 if (ff instanceof ExtensionFileFilter) {
162 fn += "." + ((ExtensionFileFilter)ff).getDefaultExtension();
163 } else if (extension != null) {
164 fn += "." + extension;
165 }
166 file = new File(fn);
167 if (!confirmOverwrite(file))
168 return null;
169 }
170 return file;
171 }
172
173 public static boolean confirmOverwrite(File file) {
174 if (file == null || (file.exists())) {
175 ExtendedDialog dialog = new ExtendedDialog(
176 Main.parent,
177 tr("Overwrite"),
178 new String[] {tr("Overwrite"), tr("Cancel")}
179 );
180 dialog.setContent(tr("File exists. Overwrite?"));
181 dialog.setButtonIcons(new String[] {"save_as.png", "cancel.png"});
182 dialog.showDialog();
183 return (dialog.getValue() == 1);
184 }
185 return true;
186 }
187
188 protected void addToFileOpenHistory() {
189 String filepath;
190 try {
191 filepath = file.getCanonicalPath();
192 } catch (IOException ign) {
193 return;
194 }
195
196 int maxsize = Math.max(0, Main.pref.getInteger("file-open.history.max-size", 15));
197 Collection<String> oldHistory = Main.pref.getCollection("file-open.history");
198 List<String> history = new LinkedList<String>(oldHistory);
199 history.remove(filepath);
200 history.add(0, filepath);
201 Main.pref.putCollectionBounded("file-open.history", maxsize, history);
202 }
203}
Note: See TracBrowser for help on using the repository browser.