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