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