001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.actions;
003
004 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005 import static org.openstreetmap.josm.tools.I18n.tr;
006
007 import java.awt.event.ActionEvent;
008 import java.io.File;
009 import java.io.IOException;
010 import java.util.Arrays;
011 import java.util.List;
012
013 import javax.swing.JFileChooser;
014 import javax.swing.JOptionPane;
015 import javax.swing.SwingUtilities;
016
017 import org.openstreetmap.josm.Main;
018 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
019 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
020 import org.openstreetmap.josm.gui.layer.Layer;
021 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
022 import org.openstreetmap.josm.gui.util.FileFilterAllFiles;
023 import org.openstreetmap.josm.io.IllegalDataException;
024 import org.openstreetmap.josm.io.session.SessionReader;
025
026 public class SessionLoadAction extends DiskAccessAction {
027
028 public SessionLoadAction() {
029 super(tr("Load Session"), "open", tr("Load a session from file."), null, true, "load-session", true);
030 putValue("help", ht("/Action/SessionLoad"));
031 }
032
033 public void actionPerformed(ActionEvent e) {
034 ExtensionFileFilter ff = new ExtensionFileFilter("jos,joz", "jos", tr("Session file (*.jos, *.joz)"));
035 JFileChooser fc = createAndOpenFileChooser(true, false, tr("Open session"), Arrays.asList(ff, FileFilterAllFiles.getInstance()), ff, JFileChooser.FILES_ONLY, "lastDirectory");
036 if (fc == null) return;
037 File file = fc.getSelectedFile();
038 boolean zip = file.getName().toLowerCase().endsWith(".joz");
039 Main.worker.submit(new Loader(file, zip));
040 }
041
042 public static class Loader extends PleaseWaitRunnable {
043
044 private boolean canceled;
045 private File file;
046 private boolean zip;
047 private List<Layer> layers;
048 private List<Runnable> postLoadTasks;
049
050 public Loader(File file, boolean zip) {
051 super(tr("Loading session ''{0}''", file.getName()));
052 this.file = file;
053 this.zip = zip;
054 }
055
056 @Override
057 protected void cancel() {
058 Thread.dumpStack();
059 canceled = true;
060 }
061
062 @Override
063 protected void finish() {
064 SwingUtilities.invokeLater(new Runnable() {
065 @Override
066 public void run() {
067 if (canceled) return;
068 for (Layer l : layers) {
069 if (canceled) return;
070 Main.main.addLayer(l);
071 }
072 for (Runnable task : postLoadTasks) {
073 if (canceled) return;
074 if (task == null) {
075 continue;
076 }
077 task.run();
078 }
079 }
080 });
081 }
082
083 @Override
084 protected void realRun() {
085 try {
086 ProgressMonitor monitor = getProgressMonitor();
087 SessionReader reader = new SessionReader();
088 reader.loadSession(file, zip, monitor);
089 layers = reader.getLayers();
090 postLoadTasks = reader.getPostLoadTasks();
091 } catch (IllegalDataException e) {
092 e.printStackTrace();
093 HelpAwareOptionPane.showMessageDialogInEDT(
094 Main.parent,
095 tr("<html>Could not load session file ''{0}''.<br>Error is:<br>{1}</html>", file.getName(), e.getMessage()),
096 tr("Data Error"),
097 JOptionPane.ERROR_MESSAGE,
098 null
099 );
100 cancel();
101 } catch (IOException e) {
102 e.printStackTrace();
103 HelpAwareOptionPane.showMessageDialogInEDT(
104 Main.parent,
105 tr("<html>Could not load session file ''{0}''.<br>Error is:<br>{1}</html>", file.getName(), e.getMessage()),
106 tr("IO Error"),
107 JOptionPane.ERROR_MESSAGE,
108 null
109 );
110 cancel();
111 } catch (RuntimeException e) {
112 cancel();
113 throw e;
114 } catch (Error e) {
115 cancel();
116 throw e;
117 }
118 }
119 }
120 }
121