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

Last change on this file since 5501 was 5501, checked in by bastiK, 12 years ago

add session support for gpx layers (see #4029)

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