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

Last change on this file since 5460 was 5460, checked in by Don-vip, 12 years ago

global use of Main.isDisplayingMapView()

  • Property svn:eol-style set to native
File size: 6.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.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 String fn = file.getPath();
150 if (fn.indexOf('.') == -1)
151 {
152 FileFilter ff = fc.getFileFilter();
153 if (ff instanceof ExtensionFileFilter) {
154 fn += "." + ((ExtensionFileFilter)ff).getDefaultExtension();
155 } else if (extension != null) {
156 fn += "." + extension;
157 }
158 file = new File(fn);
159 if (!confirmOverwrite(file))
160 return null;
161 }
162 return file;
163 }
164
165 public static boolean confirmOverwrite(File file) {
166 if (file == null || (file.exists())) {
167 ExtendedDialog dialog = new ExtendedDialog(
168 Main.parent,
169 tr("Overwrite"),
170 new String[] {tr("Overwrite"), tr("Cancel")}
171 );
172 dialog.setContent(tr("File exists. Overwrite?"));
173 dialog.setButtonIcons(new String[] {"save_as.png", "cancel.png"});
174 dialog.showDialog();
175 return (dialog.getValue() == 1);
176 }
177 return true;
178 }
179
180 protected void addToFileOpenHistory() {
181 String filepath;
182 try {
183 filepath = file.getCanonicalPath();
184 } catch (IOException ign) {
185 return;
186 }
187
188 int maxsize = Math.max(0, Main.pref.getInteger("file-open.history.max-size", 15));
189 Collection<String> oldHistory = Main.pref.getCollection("file-open.history");
190 List<String> history = new LinkedList<String>(oldHistory);
191 history.remove(filepath);
192 history.add(0, filepath);
193 Main.pref.putCollectionBounded("file-open.history", maxsize, history);
194 }
195}
Note: See TracBrowser for help on using the repository browser.