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

Last change on this file since 6361 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
RevLine 
[319]1//License: GPL. Copyright 2007 by Immanuel Scholz and others
[290]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;
[4371]9import java.util.Collection;
10import java.util.LinkedList;
11import java.util.List;
[5014]12
[1949]13import javax.swing.JFileChooser;
[290]14import javax.swing.JOptionPane;
[1949]15import javax.swing.filechooser.FileFilter;
[290]16
17import org.openstreetmap.josm.Main;
[1397]18import org.openstreetmap.josm.gui.ExtendedDialog;
[1523]19import org.openstreetmap.josm.gui.layer.Layer;
[290]20import org.openstreetmap.josm.gui.layer.OsmDataLayer;
[1949]21import org.openstreetmap.josm.io.FileExporter;
[1084]22import org.openstreetmap.josm.tools.Shortcut;
[290]23
[1820]24public abstract class SaveActionBase extends DiskAccessAction {
[4371]25 private File file;
[290]26
[1808]27 public SaveActionBase(String name, String iconName, String tooltip, Shortcut shortcut) {
[1169]28 super(name, iconName, tooltip, shortcut);
29 }
[1023]30
[4371]31 @Override
[1169]32 public void actionPerformed(ActionEvent e) {
[5014]33 if (!isEnabled())
[1808]34 return;
[4371]35 boolean saved = doSave();
36 if (saved) {
37 addToFileOpenHistory();
38 }
[1373]39 }
40
[1808]41 public boolean doSave() {
[5459]42 if (Main.isDisplayingMapView()) {
43 Layer layer = Main.map.mapView.getActiveLayer();
44 if (layer != null && layer.isSavable()) {
45 return doSave(layer);
46 }
[1750]47 }
[5459]48 return false;
[1808]49 }
[290]50
[1808]51 public boolean doSave(Layer layer) {
[5459]52 if(!layer.checkSaveConditions())
[1808]53 return false;
[4371]54 file = getFile(layer);
55 return doInternalSave(layer, file);
[4114]56 }
57
[5014]58 public static boolean doSave(Layer layer, File file) {
[5459]59 if(!layer.checkSaveConditions())
[1808]60 return false;
[4114]61 return doInternalSave(layer, file);
62 }
[290]63
[5014]64 private static boolean doInternalSave(Layer layer, File file) {
[1169]65 if (file == null)
[1373]66 return false;
[290]67
[1949]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;
[4463]74 break;
[1949]75 }
76 }
77 if (!exported) {
[2017]78 JOptionPane.showMessageDialog(Main.parent, tr("No Exporter found! Nothing saved."), tr("Warning"),
[1949]79 JOptionPane.WARNING_MESSAGE);
80 return false;
81 }
82 layer.setName(file.getName());
83 layer.setAssociatedFile(file);
[2025]84 if (layer instanceof OsmDataLayer) {
85 ((OsmDataLayer) layer).onPostSaveToFile();
86 }
[1949]87 Main.parent.repaint();
88 } catch (IOException e) {
89 e.printStackTrace();
90 return false;
91 }
[1373]92 return true;
[1169]93 }
[319]94
[1169]95 protected abstract File getFile(Layer layer);
[290]96
[1169]97 /**
[1808]98 * Refreshes the enabled state
[1949]99 *
[1808]100 */
[1820]101 @Override
102 protected void updateEnabledState() {
[1879]103 if (Main.applet) {
104 setEnabled(false);
105 return;
106 }
[5460]107 boolean check = Main.isDisplayingMapView()
[1808]108 && Main.map.mapView.getActiveLayer() != null;
109 if(!check) {
110 setEnabled(false);
111 return;
112 }
113 Layer layer = Main.map.mapView.getActiveLayer();
[5459]114 setEnabled(layer != null && layer.isSavable());
[1808]115 }
[1949]116
[5456]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.
[6069]120 *
[5456]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.
[6069]135 *
[5456]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 */
[1949]141 public static File createAndOpenSaveFileChooser(String title, String extension) {
[5438]142 JFileChooser fc = createAndOpenFileChooser(false, false, title, extension);
[5456]143 return checkFileAndConfirmOverWrite(fc, extension);
144 }
[6069]145
[5456]146 private static File checkFileAndConfirmOverWrite(JFileChooser fc, String extension) {
147 if (fc == null) return null;
[1949]148 File file = fc.getSelectedFile();
[6069]149
[6011]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();
[3570]161 if (ff instanceof ExtensionFileFilter) {
162 fn += "." + ((ExtensionFileFilter)ff).getDefaultExtension();
[5456]163 } else if (extension != null) {
[3570]164 fn += "." + extension;
[1949]165 }
[3570]166 file = new File(fn);
[5457]167 if (!confirmOverwrite(file))
168 return null;
[1949]169 }
[3863]170 return file;
171 }
172
[4911]173 public static boolean confirmOverwrite(File file) {
[3863]174 if (file == null || (file.exists())) {
[2070]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();
[3863]183 return (dialog.getValue() == 1);
[2070]184 }
[3863]185 return true;
[1949]186 }
[4371]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);
[4374]199 history.remove(filepath);
[4371]200 history.add(0, filepath);
201 Main.pref.putCollectionBounded("file-open.history", maxsize, history);
202 }
[290]203}
Note: See TracBrowser for help on using the repository browser.