source: josm/trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java@ 2702

Last change on this file since 2702 was 2702, checked in by bastiK, 14 years ago

fixed #4100 - unable to simply load already referenced images
Added 'jpg' to the list of available formats for 'File' > 'Open...'

File size: 6.4 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
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.awt.event.KeyEvent;
9import java.io.File;
10import java.io.IOException;
11import java.util.ArrayList;
12import java.util.Arrays;
13import java.util.Collections;
14import java.util.List;
15
16import javax.swing.JFileChooser;
17import javax.swing.JOptionPane;
18import javax.swing.filechooser.FileFilter;
19
20import org.openstreetmap.josm.Main;
21import org.openstreetmap.josm.gui.PleaseWaitRunnable;
22import org.openstreetmap.josm.io.AllFormatsImporter;
23import org.openstreetmap.josm.io.FileImporter;
24import org.openstreetmap.josm.io.IllegalDataException;
25import org.openstreetmap.josm.io.OsmTransferException;
26import org.openstreetmap.josm.tools.MultiMap;
27import org.openstreetmap.josm.tools.Shortcut;
28import org.xml.sax.SAXException;
29
30/**
31 * Open a file chooser dialog and select an file to import. Then call the gpx-import driver. Finally
32 * open an internal frame into the main window with the gpx data shown.
33 *
34 * @author imi
35 */
36public class OpenFileAction extends DiskAccessAction {
37
38 /**
39 * Create an open action. The name is "Open a file".
40 */
41 public OpenFileAction() {
42 super(tr("Open..."), "open", tr("Open a file."),
43 Shortcut.registerShortcut("system:open", tr("File: {0}", tr("Open...")), KeyEvent.VK_O, Shortcut.GROUP_MENU));
44 putValue("help", ht("/Action/OpenFile"));
45
46 }
47
48 public void actionPerformed(ActionEvent e) {
49 JFileChooser fc = createAndOpenFileChooser(true, true, null);
50 if (fc == null)
51 return;
52 File[] files = fc.getSelectedFiles();
53 OpenFileTask task = new OpenFileTask(Arrays.asList(files), fc.getFileFilter());
54 Main.worker.submit(task);
55 }
56
57 @Override
58 protected void updateEnabledState() {
59 setEnabled(! Main.applet);
60 }
61
62 static public class OpenFileTask extends PleaseWaitRunnable {
63 private List<File> files;
64 private FileFilter fileFilter;
65 private boolean cancelled;
66
67 public OpenFileTask(List<File> files, FileFilter fileFilter) {
68 super(tr("Opening files"), false /* don't ignore exception */);
69 this.files = new ArrayList<File>(files);
70 this.fileFilter = fileFilter;
71 }
72 @Override
73 protected void cancel() {
74 this.cancelled = true;
75 }
76
77 @Override
78 protected void finish() {
79 // do nothing
80 }
81
82 @Override
83 protected void realRun() throws SAXException, IOException, OsmTransferException {
84 if (files == null || files.isEmpty()) return;
85
86 /**
87 * Find the importer with the chosen file filter
88 */
89 FileImporter chosenImporter = null;
90 for (FileImporter importer : ExtensionFileFilter.importers) {
91 if (fileFilter == importer.filter) {
92 chosenImporter = importer;
93 }
94 }
95 /**
96 * If the filter wasn't changed in the dialog, chosenImporter is null now.
97 * When the filter was expicitly set to AllFormatsImporter, treat this the same.
98 */
99 if (chosenImporter instanceof AllFormatsImporter) {
100 chosenImporter = null;
101 }
102 getProgressMonitor().setTicks(files.size());
103
104 if (chosenImporter != null) { // The importer was expicitely chosen, so use it.
105 //System.err.println("Importer: " +chosenImporter.getClass().getName());
106 for (File f : files) {
107 if (!chosenImporter.acceptFile(f)) {
108 if (f.isDirectory()) {
109 JOptionPane.showMessageDialog(
110 Main.parent,
111 tr("<html>Cannot open directory.<br>Please select a file!"),
112 tr("Open file"),
113 JOptionPane.INFORMATION_MESSAGE
114 );
115 return;
116 } else
117 throw new IllegalStateException();
118 }
119 }
120 importData(chosenImporter, files);
121 }
122 else { // find apropriate importer
123 MultiMap<FileImporter, File> map = new MultiMap<FileImporter, File>();
124 while (! files.isEmpty()) {
125 File f = files.get(0);
126 for (FileImporter importer : ExtensionFileFilter.importers) {
127 if (importer.acceptFile(f)) {
128 map.add(importer, f);
129 files.remove(f);
130 }
131 }
132 if (files.contains(f))
133 throw new RuntimeException(); // no importer found
134 }
135 List<FileImporter> ims = new ArrayList<FileImporter>(map.keySet());
136 Collections.sort(ims);
137 Collections.reverse(ims);
138 for (FileImporter importer : ims) {
139 //System.err.println("Using "+importer.getClass().getName());
140 List<File> files = map.get(importer);
141 //System.err.println("for files: "+files);
142 importData(importer, files);
143 }
144 }
145 }
146
147 public void importData(FileImporter importer, List<File> files) {
148 if (importer.isBatchImporter()) {
149 if (cancelled) return;
150 String msg;
151 if (files.size() == 1) {
152 msg = tr("Opening 1 file...");
153 } else {
154 msg = tr("Opening {0} files...", files.size());
155 }
156 getProgressMonitor().indeterminateSubTask(msg);
157 importer.importDataHandleExceptions(files);
158 getProgressMonitor().worked(files.size());
159 } else {
160 for (File f : files) {
161 if (cancelled) return;
162 getProgressMonitor().indeterminateSubTask(tr("Opening file ''{0}'' ...", f.getAbsolutePath()));
163 importer.importDataHandleExceptions(f);
164 getProgressMonitor().worked(1);
165 }
166 }
167 }
168 }
169}
Note: See TracBrowser for help on using the repository browser.