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