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