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

Last change on this file since 2484 was 2367, checked in by framm, 14 years ago

make file types optional so that JOSM still works if certain importers/exporters are not available. allows building .jar files e.g. without bzip2 support

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