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

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

fix some sonar issues

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