source: josm/trunk/src/org/openstreetmap/josm/actions/SessionSaveAsAction.java@ 9073

Last change on this file since 9073 was 9062, checked in by Don-vip, 8 years ago

Sonar - squid:S1941 - Variables should not be declared before they are relevant

  • Property svn:eol-style set to native
File size: 9.7 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.Component;
8import java.awt.Dimension;
9import java.awt.GridBagLayout;
10import java.awt.event.ActionEvent;
11import java.io.File;
12import java.io.IOException;
13import java.util.ArrayList;
14import java.util.Arrays;
15import java.util.Collection;
16import java.util.HashMap;
17import java.util.HashSet;
18import java.util.List;
19import java.util.Map;
20import java.util.Set;
21
22import javax.swing.BorderFactory;
23import javax.swing.JCheckBox;
24import javax.swing.JFileChooser;
25import javax.swing.JLabel;
26import javax.swing.JOptionPane;
27import javax.swing.JPanel;
28import javax.swing.JScrollPane;
29import javax.swing.JTabbedPane;
30import javax.swing.SwingConstants;
31import javax.swing.border.EtchedBorder;
32import javax.swing.filechooser.FileFilter;
33
34import org.openstreetmap.josm.Main;
35import org.openstreetmap.josm.gui.ExtendedDialog;
36import org.openstreetmap.josm.gui.HelpAwareOptionPane;
37import org.openstreetmap.josm.gui.layer.Layer;
38import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
39import org.openstreetmap.josm.io.session.SessionLayerExporter;
40import org.openstreetmap.josm.io.session.SessionWriter;
41import org.openstreetmap.josm.tools.GBC;
42import org.openstreetmap.josm.tools.MultiMap;
43import org.openstreetmap.josm.tools.UserCancelException;
44import org.openstreetmap.josm.tools.Utils;
45import org.openstreetmap.josm.tools.WindowGeometry;
46
47/**
48 * Saves a JOSM session
49 * @since 4685
50 */
51public class SessionSaveAsAction extends DiskAccessAction {
52
53 private transient List<Layer> layers;
54 private transient Map<Layer, SessionLayerExporter> exporters;
55 private transient MultiMap<Layer, Layer> dependencies;
56
57 /**
58 * Constructs a new {@code SessionSaveAsAction}.
59 */
60 public SessionSaveAsAction() {
61 super(tr("Save Session As..."), "session", tr("Save the current session to a new file."), null, true, "save_as-session", true);
62 putValue("help", ht("/Action/SessionSaveAs"));
63 }
64
65 @Override
66 public void actionPerformed(ActionEvent e) {
67 try {
68 saveSession();
69 } catch (UserCancelException ignore) {
70 if (Main.isTraceEnabled()) {
71 Main.trace(ignore.getMessage());
72 }
73 }
74 }
75
76 /**
77 * Attempts to save the session.
78 * @throws UserCancelException when the user has cancelled the save process.
79 * @since 8913
80 */
81 public void saveSession() throws UserCancelException {
82 if (!isEnabled()) {
83 return;
84 }
85
86 SessionSaveAsDialog dlg = new SessionSaveAsDialog();
87 dlg.showDialog();
88 if (dlg.getValue() != 1) {
89 throw new UserCancelException();
90 }
91
92 boolean zipRequired = false;
93 for (Layer l : layers) {
94 SessionLayerExporter ex = exporters.get(l);
95 if (ex != null && ex.requiresZip()) {
96 zipRequired = true;
97 break;
98 }
99 }
100
101 FileFilter joz = new ExtensionFileFilter("joz", "joz", tr("Session file (archive) (*.joz)"));
102 FileFilter jos = new ExtensionFileFilter("jos", "jos", tr("Session file (*.jos)"));
103
104 AbstractFileChooser fc;
105
106 if (zipRequired) {
107 fc = createAndOpenFileChooser(false, false, tr("Save session"), joz, JFileChooser.FILES_ONLY, "lastDirectory");
108 } else {
109 fc = createAndOpenFileChooser(false, false, tr("Save session"), Arrays.asList(new FileFilter[]{jos, joz}), jos,
110 JFileChooser.FILES_ONLY, "lastDirectory");
111 }
112
113 if (fc == null) {
114 throw new UserCancelException();
115 }
116
117 File file = fc.getSelectedFile();
118 String fn = file.getName();
119
120 boolean zip;
121 FileFilter ff = fc.getFileFilter();
122 if (zipRequired) {
123 zip = true;
124 } else if (joz.equals(ff)) {
125 zip = true;
126 } else if (jos.equals(ff)) {
127 zip = false;
128 } else {
129 if (Utils.hasExtension(fn, "joz")) {
130 zip = true;
131 } else {
132 zip = false;
133 }
134 }
135 if (fn.indexOf('.') == -1) {
136 file = new File(file.getPath() + (zip ? ".joz" : ".jos"));
137 if (!SaveActionBase.confirmOverwrite(file)) {
138 throw new UserCancelException();
139 }
140 }
141
142 List<Layer> layersOut = new ArrayList<>();
143 for (Layer layer : layers) {
144 if (exporters.get(layer) == null || !exporters.get(layer).shallExport()) continue;
145 // TODO: resolve dependencies for layers excluded by the user
146 layersOut.add(layer);
147 }
148
149 int active = -1;
150 Layer activeLayer = Main.map.mapView.getActiveLayer();
151 if (activeLayer != null) {
152 active = layersOut.indexOf(activeLayer);
153 }
154
155 SessionWriter sw = new SessionWriter(layersOut, active, exporters, dependencies, zip);
156 try {
157 sw.write(file);
158 SaveActionBase.addToFileOpenHistory(file);
159 } catch (IOException ex) {
160 Main.error(ex);
161 HelpAwareOptionPane.showMessageDialogInEDT(
162 Main.parent,
163 tr("<html>Could not save session file ''{0}''.<br>Error is:<br>{1}</html>", file.getName(), ex.getMessage()),
164 tr("IO Error"),
165 JOptionPane.ERROR_MESSAGE,
166 null
167 );
168 }
169 }
170
171 /**
172 * The "Save Session" dialog
173 */
174 public class SessionSaveAsDialog extends ExtendedDialog {
175
176 /**
177 * Constructs a new {@code SessionSaveAsDialog}.
178 */
179 public SessionSaveAsDialog() {
180 super(Main.parent, tr("Save Session"), new String[] {tr("Save As"), tr("Cancel")});
181 initialize();
182 setButtonIcons(new String[] {"save_as", "cancel"});
183 setDefaultButton(1);
184 setRememberWindowGeometry(getClass().getName() + ".geometry",
185 WindowGeometry.centerInWindow(Main.parent, new Dimension(350, 450)));
186 setContent(build(), false);
187 }
188
189 /**
190 * Initializes action.
191 */
192 public final void initialize() {
193 layers = new ArrayList<>(Main.map.mapView.getAllLayersAsList());
194 exporters = new HashMap<>();
195 dependencies = new MultiMap<>();
196
197 Set<Layer> noExporter = new HashSet<>();
198
199 for (Layer layer : layers) {
200 SessionLayerExporter exporter = SessionWriter.getSessionLayerExporter(layer);
201 if (exporter != null) {
202 exporters.put(layer, exporter);
203 Collection<Layer> deps = exporter.getDependencies();
204 if (deps != null) {
205 dependencies.putAll(layer, deps);
206 } else {
207 dependencies.putVoid(layer);
208 }
209 } else {
210 noExporter.add(layer);
211 exporters.put(layer, null);
212 }
213 }
214
215 int numNoExporter = 0;
216 WHILE: while (numNoExporter != noExporter.size()) {
217 numNoExporter = noExporter.size();
218 for (Layer layer : layers) {
219 if (noExporter.contains(layer)) continue;
220 for (Layer depLayer : dependencies.get(layer)) {
221 if (noExporter.contains(depLayer)) {
222 noExporter.add(layer);
223 exporters.put(layer, null);
224 break WHILE;
225 }
226 }
227 }
228 }
229 }
230
231 protected final Component build() {
232 JPanel ip = new JPanel(new GridBagLayout());
233 for (Layer layer : layers) {
234 JPanel wrapper = new JPanel(new GridBagLayout());
235 wrapper.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
236 Component exportPanel;
237 SessionLayerExporter exporter = exporters.get(layer);
238 if (exporter == null) {
239 if (!exporters.containsKey(layer)) throw new AssertionError();
240 exportPanel = getDisabledExportPanel(layer);
241 } else {
242 exportPanel = exporter.getExportPanel();
243 }
244 wrapper.add(exportPanel, GBC.std().fill(GBC.HORIZONTAL));
245 ip.add(wrapper, GBC.eol().fill(GBC.HORIZONTAL).insets(2, 2, 4, 2));
246 }
247 ip.add(GBC.glue(0, 1), GBC.eol().fill(GBC.VERTICAL));
248 JScrollPane sp = new JScrollPane(ip);
249 sp.setBorder(BorderFactory.createEmptyBorder());
250 JPanel p = new JPanel(new GridBagLayout());
251 p.add(sp, GBC.eol().fill());
252 final JTabbedPane tabs = new JTabbedPane();
253 tabs.addTab(tr("Layers"), p);
254 return tabs;
255 }
256
257 protected final Component getDisabledExportPanel(Layer layer) {
258 JPanel p = new JPanel(new GridBagLayout());
259 JCheckBox include = new JCheckBox();
260 include.setEnabled(false);
261 JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT);
262 lbl.setToolTipText(tr("No exporter for this layer"));
263 lbl.setLabelFor(include);
264 lbl.setEnabled(false);
265 p.add(include, GBC.std());
266 p.add(lbl, GBC.std());
267 p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
268 return p;
269 }
270 }
271
272 @Override
273 protected void updateEnabledState() {
274 setEnabled(Main.isDisplayingMapView());
275 }
276}
Note: See TracBrowser for help on using the repository browser.