source: josm/trunk/src/org/openstreetmap/josm/actions/SessionLoadAction.java @ 5241

Revision 4874, 4.8 KB checked in by jttt, 4 months ago (diff)

Use static class were appropriate

  • Property svn:eol-style set to native
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.ActionEvent;
8import java.io.File;
9import java.io.IOException;
10import java.util.List;
11
12import javax.swing.JFileChooser;
13import javax.swing.JOptionPane;
14import javax.swing.SwingUtilities;
15import javax.swing.filechooser.FileFilter;
16
17import org.openstreetmap.josm.Main;
18import org.openstreetmap.josm.gui.HelpAwareOptionPane;
19import org.openstreetmap.josm.gui.PleaseWaitRunnable;
20import org.openstreetmap.josm.gui.layer.Layer;
21import org.openstreetmap.josm.gui.progress.ProgressMonitor;
22import org.openstreetmap.josm.io.IllegalDataException;
23import org.openstreetmap.josm.io.session.SessionReader;
24
25public class SessionLoadAction extends JosmAction {
26    public SessionLoadAction() {
27        super(tr("Load Session"), "open", tr("Load a session from file."), null, true, "load-session", true);
28        putValue("help", ht("/Action/SessionLoad"));
29    }
30
31    public void actionPerformed(ActionEvent e) {
32        String curDir = Main.pref.get("lastDirectory");
33        if (curDir.equals("")) {
34            curDir = ".";
35        }
36        JFileChooser fc = new JFileChooser(new File(curDir));
37        fc.setDialogTitle(tr("Open session"));
38        fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
39        fc.setMultiSelectionEnabled(false);
40        fc.setAcceptAllFileFilterUsed(true);
41        FileFilter ff = new ExtensionFileFilter("jos,joz", "jos", tr("Session file (*.jos, *.joz)"));
42        fc.addChoosableFileFilter(ff);
43        int answer = fc.showOpenDialog(Main.parent);
44        if (answer != JFileChooser.APPROVE_OPTION)
45            return;
46
47        if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir)) {
48            Main.pref.put("lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
49        }
50        File file = fc.getSelectedFile();
51        boolean zip = true;
52        if (file.getName().toLowerCase().endsWith(".jos")) {
53            zip = false;
54        }
55        Main.worker.submit(new Loader(file, zip));
56    }
57
58    public static class Loader extends PleaseWaitRunnable {
59
60        private boolean canceled;
61        private File file;
62        private boolean zip;
63        private List<Layer> layers;
64        private List<Runnable> postLoadTasks;
65
66        public Loader(File file, boolean zip) {
67            super(tr("Loading session ''{0}''", file.getName()));
68            this.file = file;
69            this.zip = zip;
70        }
71
72        @Override
73        protected void cancel() {
74            Thread.currentThread().dumpStack();
75            canceled = true;
76        }
77
78        @Override
79        protected void finish() {
80            SwingUtilities.invokeLater(new Runnable() {
81                @Override
82                public void run() {
83                    if (canceled) return;
84                    for (Layer l : layers) {
85                        if (canceled) return;
86                        Main.main.addLayer(l);
87                    }
88                    for (Runnable task : postLoadTasks) {
89                        if (canceled) return;
90                        if (task == null) {
91                            continue;
92                        }
93                        task.run();
94                    }
95                }
96            });
97        }
98
99        @Override
100        protected void realRun() {
101            try {
102                ProgressMonitor monitor = getProgressMonitor();
103                SessionReader reader = new SessionReader();
104                reader.loadSession(file, zip, monitor);
105                layers = reader.getLayers();
106                postLoadTasks = reader.getPostLoadTasks();
107            } catch (IllegalDataException e) {
108                e.printStackTrace();
109                HelpAwareOptionPane.showMessageDialogInEDT(
110                        Main.parent,
111                        tr("<html>Could not load session file ''{0}''.<br>Error is:<br>{1}</html>", file.getName(), e.getMessage()),
112                        tr("Data Error"),
113                        JOptionPane.ERROR_MESSAGE,
114                        null
115                        );
116                cancel();
117            } catch (IOException e) {
118                e.printStackTrace();
119                HelpAwareOptionPane.showMessageDialogInEDT(
120                        Main.parent,
121                        tr("<html>Could not load session file ''{0}''.<br>Error is:<br>{1}</html>", file.getName(), e.getMessage()),
122                        tr("IO Error"),
123                        JOptionPane.ERROR_MESSAGE,
124                        null
125                        );
126                cancel();
127            } catch (RuntimeException e) {
128                cancel();
129                throw e;
130            } catch (Error e) {
131                cancel();
132                throw e;
133            }
134        }
135    }
136}
137
Note: See TracBrowser for help on using the repository browser.