source: josm/trunk/src/org/openstreetmap/josm/actions/SessionLoadAction.java@ 12518

Last change on this file since 12518 was 12486, checked in by bastiK, 7 years ago

see #15013, see #14877 - remember projection when session is saved to a .jos/.joz file

  • Property svn:eol-style set to native
File size: 7.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.event.ActionEvent;
8import java.io.File;
9import java.io.IOException;
10import java.io.InputStream;
11import java.net.URI;
12import java.nio.file.Files;
13import java.nio.file.StandardCopyOption;
14import java.util.Arrays;
15import java.util.List;
16
17import javax.swing.JFileChooser;
18import javax.swing.JOptionPane;
19import javax.swing.SwingUtilities;
20
21import org.openstreetmap.josm.Main;
22import org.openstreetmap.josm.gui.HelpAwareOptionPane;
23import org.openstreetmap.josm.gui.PleaseWaitRunnable;
24import org.openstreetmap.josm.gui.layer.Layer;
25import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
26import org.openstreetmap.josm.gui.progress.ProgressMonitor;
27import org.openstreetmap.josm.gui.util.FileFilterAllFiles;
28import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
29import org.openstreetmap.josm.io.IllegalDataException;
30import org.openstreetmap.josm.io.session.SessionImporter;
31import org.openstreetmap.josm.io.session.SessionReader;
32import org.openstreetmap.josm.io.session.SessionReader.SessionProjectionChoiceData;
33import org.openstreetmap.josm.io.session.SessionReader.SessionViewportData;
34import org.openstreetmap.josm.tools.CheckParameterUtil;
35import org.openstreetmap.josm.tools.JosmRuntimeException;
36import org.openstreetmap.josm.tools.Utils;
37
38/**
39 * Loads a JOSM session.
40 * @since 4668
41 */
42public class SessionLoadAction extends DiskAccessAction {
43
44 /**
45 * Constructs a new {@code SessionLoadAction}.
46 */
47 public SessionLoadAction() {
48 super(tr("Load Session"), "open", tr("Load a session from file."), null, true, "load-session", true);
49 putValue("help", ht("/Action/SessionLoad"));
50 }
51
52 @Override
53 public void actionPerformed(ActionEvent e) {
54 AbstractFileChooser fc = createAndOpenFileChooser(true, false, tr("Open session"),
55 Arrays.asList(SessionImporter.FILE_FILTER, FileFilterAllFiles.getInstance()),
56 SessionImporter.FILE_FILTER, JFileChooser.FILES_ONLY, "lastDirectory");
57 if (fc == null)
58 return;
59 File file = fc.getSelectedFile();
60 boolean zip = Utils.hasExtension(file, "joz");
61 Main.worker.submit(new Loader(file, zip));
62 }
63
64 /**
65 * JOSM session loader
66 */
67 public static class Loader extends PleaseWaitRunnable {
68
69 private boolean canceled;
70 private File file;
71 private final URI uri;
72 private final InputStream is;
73 private final boolean zip;
74 private List<Layer> layers;
75 private Layer active;
76 private List<Runnable> postLoadTasks;
77 private SessionViewportData viewport;
78 private SessionProjectionChoiceData projectionChoice;
79
80 /**
81 * Constructs a new {@code Loader} for local session file.
82 * @param file The JOSM session file
83 * @param zip {@code true} if the file is a session archive file (*.joz)
84 */
85 public Loader(File file, boolean zip) {
86 super(tr("Loading session ''{0}''", file.getName()));
87 CheckParameterUtil.ensureParameterNotNull(file, "file");
88 this.file = file;
89 this.uri = null;
90 this.is = null;
91 this.zip = zip;
92 }
93
94 /**
95 * Constructs a new {@code Loader} for session file input stream (may be a remote file).
96 * @param is The input stream to session file
97 * @param uri The file URI
98 * @param zip {@code true} if the file is a session archive file (*.joz)
99 * @since 6245
100 */
101 public Loader(InputStream is, URI uri, boolean zip) {
102 super(tr("Loading session ''{0}''", uri));
103 CheckParameterUtil.ensureParameterNotNull(is, "is");
104 CheckParameterUtil.ensureParameterNotNull(uri, "uri");
105 this.file = null;
106 this.uri = uri;
107 this.is = is;
108 this.zip = zip;
109 }
110
111 @Override
112 public void cancel() {
113 canceled = true;
114 }
115
116 @Override
117 protected void finish() {
118 SwingUtilities.invokeLater(() -> {
119 if (canceled)
120 return;
121 if (projectionChoice != null) {
122 ProjectionPreference.setProjection(
123 projectionChoice.getProjectionChoiceId(),
124 projectionChoice.getSubPreferences(),
125 false);
126 }
127 addLayers();
128 runPostLoadTasks();
129 });
130 }
131
132 private void addLayers() {
133 if (layers != null && !layers.isEmpty()) {
134 boolean noMap = Main.map == null;
135 for (Layer l : layers) {
136 if (canceled)
137 return;
138 Main.getLayerManager().addLayer(l);
139 }
140 if (active != null) {
141 Main.getLayerManager().setActiveLayer(active);
142 }
143 if (noMap && viewport != null) {
144 Main.map.mapView.scheduleZoomTo(viewport.getEastNorthViewport(Main.getProjection()));
145 }
146 }
147 }
148
149 private void runPostLoadTasks() {
150 if (postLoadTasks != null) {
151 for (Runnable task : postLoadTasks) {
152 if (canceled)
153 return;
154 if (task == null) {
155 continue;
156 }
157 task.run();
158 }
159 }
160 }
161
162 @Override
163 protected void realRun() {
164 try {
165 ProgressMonitor monitor = getProgressMonitor();
166 SessionReader reader = new SessionReader();
167 boolean tempFile = false;
168 try {
169 if (file == null) {
170 // Download and write entire joz file as a temp file on disk as we need random access later
171 file = File.createTempFile("session_", ".joz", Utils.getJosmTempDir());
172 tempFile = true;
173 Files.copy(is, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
174 }
175 reader.loadSession(file, zip, monitor);
176 layers = reader.getLayers();
177 active = reader.getActive();
178 postLoadTasks = reader.getPostLoadTasks();
179 viewport = reader.getViewport();
180 projectionChoice = reader.getProjectionChoice();
181 } finally {
182 if (tempFile) {
183 Utils.deleteFile(file);
184 file = null;
185 }
186 }
187 } catch (IllegalDataException e) {
188 handleException(tr("Data Error"), e);
189 } catch (IOException e) {
190 handleException(tr("IO Error"), e);
191 } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException e) {
192 cancel();
193 throw e;
194 }
195 }
196
197 private void handleException(String dialogTitle, Exception e) {
198 Main.error(e);
199 HelpAwareOptionPane.showMessageDialogInEDT(
200 Main.parent,
201 tr("<html>Could not load session file ''{0}''.<br>Error is:<br>{1}</html>",
202 uri != null ? uri : file.getName(), Utils.escapeReservedCharactersHTML(e.getMessage())),
203 dialogTitle,
204 JOptionPane.ERROR_MESSAGE,
205 null
206 );
207 cancel();
208 }
209 }
210}
Note: See TracBrowser for help on using the repository browser.