source: josm/trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java@ 5131

Last change on this file since 5131 was 5131, checked in by xeen, 12 years ago

automatically add file extensions added by plugins to the "All Formats" importer.

If you have the PBF plugin installed it should now be possible to open .osm.pbf
files without selecting the PBF importer first.

  • Property svn:eol-style set to native
File size: 9.8 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.actions;
3
4import java.io.File;
5import java.util.ArrayList;
6import java.util.Collections;
7import java.util.Comparator;
8import java.util.LinkedList;
9import java.util.List;
10
11import javax.swing.JFileChooser;
12import javax.swing.filechooser.FileFilter;
13
14import org.openstreetmap.josm.io.AllFormatsImporter;
15import org.openstreetmap.josm.io.FileExporter;
16import org.openstreetmap.josm.io.FileImporter;
17
18/**
19 * A file filter that filters after the extension. Also includes a list of file
20 * filters used in JOSM.
21 *
22 */
23public class ExtensionFileFilter extends FileFilter {
24
25 /**
26 * list of supported formats
27 */
28 public static final ArrayList<FileImporter> importers;
29
30 public static final ArrayList<FileExporter> exporters;
31
32 // add some file types only if the relevant classes are there;
33 // this gives us the option to painlessly drop them from the .jar
34 // and build JOSM versions without support for these formats
35
36 static {
37
38 importers = new ArrayList<FileImporter>();
39
40 String[] importerNames = {
41 "org.openstreetmap.josm.io.OsmImporter",
42 "org.openstreetmap.josm.io.OsmGzipImporter",
43 "org.openstreetmap.josm.io.OsmChangeImporter",
44 "org.openstreetmap.josm.io.GpxImporter",
45 "org.openstreetmap.josm.io.NMEAImporter",
46 "org.openstreetmap.josm.io.OsmBzip2Importer",
47 "org.openstreetmap.josm.io.JpgImporter",
48 "org.openstreetmap.josm.io.AllFormatsImporter"
49 };
50
51 for (String classname : importerNames) {
52 try {
53 Class<?> klass = Class.forName(classname);
54 importers.add((FileImporter) klass.newInstance());
55 } catch (Exception e) {}
56 }
57
58 exporters = new ArrayList<FileExporter>();
59
60 String[] exporterNames = {
61 "org.openstreetmap.josm.io.GpxExporter",
62 "org.openstreetmap.josm.io.OsmExporter",
63 "org.openstreetmap.josm.io.OsmGzipExporter",
64 "org.openstreetmap.josm.io.OsmBzip2Exporter",
65 "org.openstreetmap.josm.io.GeoJSONExporter",
66 };
67
68 for (String classname : exporterNames) {
69 try {
70 Class<?> klass = Class.forName(classname);
71 exporters.add((FileExporter)klass.newInstance());
72 } catch (Exception e) {}
73 }
74 }
75
76 private final String extensions;
77 private final String description;
78 private final String defaultExtension;
79
80 static protected void sort(List<ExtensionFileFilter> filters) {
81 Collections.sort(
82 filters,
83 new Comparator<ExtensionFileFilter>() {
84 private AllFormatsImporter all = new AllFormatsImporter();
85 public int compare(ExtensionFileFilter o1, ExtensionFileFilter o2) {
86 if (o1.getDescription().equals(all.filter.getDescription())) return 1;
87 if (o2.getDescription().equals(all.filter.getDescription())) return -1;
88 return o1.getDescription().compareTo(o2.getDescription());
89 }
90 }
91 );
92 }
93
94 /**
95 * Updates the {@see AllFormatsImporter} that is contained in the importers list. If
96 * you do not use the importers variable directly, you don’t need to call this.
97 *
98 * Updating the AllFormatsImporter is required when plugins add new importers that
99 * support new file extensions. The old AllFormatsImporter doesn’t include the new
100 * extensions and thus will not display these files.
101 */
102 public static void updateAllFormatsImporter() {
103 for(int i=0; i < importers.size(); i++) {
104 if(importers.get(i) instanceof AllFormatsImporter) {
105 importers.set(i, new AllFormatsImporter());
106 }
107 }
108 }
109
110 /**
111 * Replies an ordered list of {@see ExtensionFileFilter}s for importing.
112 * The list is ordered according to their description, an {@see AllFormatsImporter}
113 * is append at the end.
114 *
115 * @return an ordered list of {@see ExtensionFileFilter}s for importing.
116 */
117 public static List<ExtensionFileFilter> getImportExtensionFileFilters() {
118 updateAllFormatsImporter();
119 LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
120 for (FileImporter importer : importers) {
121 filters.add(importer.filter);
122 }
123 sort(filters);
124 return filters;
125 }
126
127 /**
128 * Replies an ordered list of {@see ExtensionFileFilter}s for exporting.
129 * The list is ordered according to their description, an {@see AllFormatsImporter}
130 * is append at the end.
131 *
132 * @return an ordered list of {@see ExtensionFileFilter}s for exporting.
133 */
134 public static List<ExtensionFileFilter> getExportExtensionFileFilters() {
135 LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
136 for (FileExporter exporter : exporters) {
137 if (filters.contains(exporter.filter)) {
138 continue;
139 }
140 filters.add(exporter.filter);
141 }
142 sort(filters);
143 return filters;
144 }
145
146 /**
147 * Replies the default {@see ExtensionFileFilter} for a given extension
148 *
149 * @param extension the extension
150 * @return the default {@see ExtensionFileFilter} for a given extension
151 */
152 public static ExtensionFileFilter getDefaultImportExtensionFileFilter(String extension) {
153 if (extension == null) return new AllFormatsImporter().filter;
154 for (FileImporter importer : importers) {
155 if (extension.equals(importer.filter.getDefaultExtension()))
156 return importer.filter;
157 }
158 return new AllFormatsImporter().filter;
159 }
160
161 /**
162 * Replies the default {@see ExtensionFileFilter} for a given extension
163 *
164 * @param extension the extension
165 * @return the default {@see ExtensionFileFilter} for a given extension
166 */
167 public static ExtensionFileFilter getDefaultExportExtensionFileFilter(String extension) {
168 if (extension == null) return new AllFormatsImporter().filter;
169 for (FileExporter exporter : exporters) {
170 if (extension.equals(exporter.filter.getDefaultExtension()))
171 return exporter.filter;
172 }
173 return new AllFormatsImporter().filter;
174 }
175
176 /**
177 * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
178 * file chooser for selecting a file for reading.
179 *
180 * @param fileChooser the file chooser
181 * @param extension the default extension
182 */
183 public static void applyChoosableImportFileFilters(JFileChooser fileChooser, String extension) {
184 for (ExtensionFileFilter filter: getImportExtensionFileFilters()) {
185 fileChooser.addChoosableFileFilter(filter);
186 }
187 fileChooser.setFileFilter(getDefaultImportExtensionFileFilter(extension));
188 }
189
190 /**
191 * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
192 * file chooser for selecting a file for writing.
193 *
194 * @param fileChooser the file chooser
195 * @param extension the default extension
196 */
197 public static void applyChoosableExportFileFilters(JFileChooser fileChooser, String extension) {
198 for (ExtensionFileFilter filter: getExportExtensionFileFilters()) {
199 fileChooser.addChoosableFileFilter(filter);
200 }
201 fileChooser.setFileFilter(getDefaultExportExtensionFileFilter(extension));
202 }
203
204 /**
205 * Construct an extension file filter by giving the extension to check after.
206 */
207 public ExtensionFileFilter(String extension, String defaultExtension, String description) {
208 this.extensions = extension;
209 this.defaultExtension = defaultExtension;
210 this.description = description;
211 }
212
213 public boolean acceptName(String filename) {
214 String name = filename.toLowerCase();
215 for (String ext : extensions.split(","))
216 if (name.endsWith("."+ext))
217 return true;
218 return false;
219 }
220
221 @Override public boolean accept(File pathname) {
222 if (pathname.isDirectory())
223 return true;
224 return acceptName(pathname.getName());
225 }
226
227 @Override public String getDescription() {
228 return description;
229 }
230
231 public String getExtensions() {
232 return extensions;
233 }
234
235 public String getDefaultExtension() {
236 return defaultExtension;
237 }
238
239 @Override
240 public int hashCode() {
241 final int prime = 31;
242 int result = 1;
243 result = prime * result + ((defaultExtension == null) ? 0 : defaultExtension.hashCode());
244 result = prime * result + ((description == null) ? 0 : description.hashCode());
245 result = prime * result + ((extensions == null) ? 0 : extensions.hashCode());
246 return result;
247 }
248
249 @Override
250 public boolean equals(Object obj) {
251 if (this == obj)
252 return true;
253 if (obj == null)
254 return false;
255 if (getClass() != obj.getClass())
256 return false;
257 ExtensionFileFilter other = (ExtensionFileFilter) obj;
258 if (defaultExtension == null) {
259 if (other.defaultExtension != null)
260 return false;
261 } else if (!defaultExtension.equals(other.defaultExtension))
262 return false;
263 if (description == null) {
264 if (other.description != null)
265 return false;
266 } else if (!description.equals(other.description))
267 return false;
268 if (extensions == null) {
269 if (other.extensions != null)
270 return false;
271 } else if (!extensions.equals(other.extensions))
272 return false;
273 return true;
274 }
275}
Note: See TracBrowser for help on using the repository browser.