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

Last change on this file since 2602 was 2512, checked in by stoecker, 14 years ago

i18n updated, fixed files to reduce problems when applying patches, fix #4017

  • 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 static protected void sort(List<ExtensionFileFilter> filters) {
89 Collections.sort(
90 filters,
91 new Comparator<ExtensionFileFilter>() {
92 private AllFormatsImporter all = new AllFormatsImporter();
93 public int compare(ExtensionFileFilter o1, ExtensionFileFilter o2) {
94 if (o1.getDescription().equals(all.filter.getDescription())) return 1;
95 if (o2.getDescription().equals(all.filter.getDescription())) return -1;
96 return o1.getDescription().compareTo(o2.getDescription());
97 }
98 }
99 );
100 }
101
102 /**
103 * Replies an ordered list of {@see ExtensionFileFilter}s for importing.
104 * The list is ordered according to their description, an {@see AllFormatsImporter}
105 * is append at the end.
106 *
107 * @return an ordered list of {@see ExtensionFileFilter}s for importing.
108 */
109 public static List<ExtensionFileFilter> getImportExtensionFileFilters() {
110 LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
111 for (FileImporter importer : importers) {
112 if (filters.contains(importer.filter)) {
113 continue;
114 }
115 filters.add(importer.filter);
116 }
117 sort(filters);
118 return filters;
119 }
120
121 /**
122 * Replies an ordered list of {@see ExtensionFileFilter}s for exporting.
123 * The list is ordered according to their description, an {@see AllFormatsImporter}
124 * is append at the end.
125 *
126 * @return an ordered list of {@see ExtensionFileFilter}s for exporting.
127 */
128 public static List<ExtensionFileFilter> getExportExtensionFileFilters() {
129 LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
130 for (FileExporter exporter : exporters) {
131 if (filters.contains(exporter.filter)) {
132 continue;
133 }
134 filters.add(exporter.filter);
135 }
136 sort(filters);
137 return filters;
138 }
139
140 /**
141 * Replies the default {@see ExtensionFileFilter} for a given extension
142 *
143 * @param extension the extension
144 * @return the default {@see ExtensionFileFilter} for a given extension
145 */
146 public static ExtensionFileFilter getDefaultImportExtensionFileFilter(String extension) {
147 if (extension == null) return new AllFormatsImporter().filter;
148 for (FileImporter importer : importers) {
149 if (extension.equals(importer.filter.getDefaultExtension()))
150 return importer.filter;
151 }
152 return new AllFormatsImporter().filter;
153 }
154
155 /**
156 * Replies the default {@see ExtensionFileFilter} for a given extension
157 *
158 * @param extension the extension
159 * @return the default {@see ExtensionFileFilter} for a given extension
160 */
161 public static ExtensionFileFilter getDefaultExportExtensionFileFilter(String extension) {
162 if (extension == null) return new AllFormatsImporter().filter;
163 for (FileExporter exporter : exporters) {
164 if (extension.equals(exporter.filter.getDefaultExtension()))
165 return exporter.filter;
166 }
167 return new AllFormatsImporter().filter;
168 }
169
170 /**
171 * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
172 * file chooser for selecting a file for reading.
173 *
174 * @param fileChooser the file chooser
175 * @param extension the default extension
176 */
177 public static void applyChoosableImportFileFilters(JFileChooser fileChooser, String extension) {
178 for (ExtensionFileFilter filter: getImportExtensionFileFilters()) {
179 fileChooser.addChoosableFileFilter(filter);
180 }
181 fileChooser.setFileFilter(getDefaultImportExtensionFileFilter(extension));
182 }
183
184 /**
185 * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
186 * file chooser for selecting a file for writing.
187 *
188 * @param fileChooser the file chooser
189 * @param extension the default extension
190 */
191 public static void applyChoosableExportFileFilters(JFileChooser fileChooser, String extension) {
192 for (ExtensionFileFilter filter: getExportExtensionFileFilters()) {
193 fileChooser.addChoosableFileFilter(filter);
194 }
195 fileChooser.setFileFilter(getDefaultExportExtensionFileFilter(extension));
196 }
197
198 /**
199 * Construct an extension file filter by giving the extension to check after.
200 */
201 public ExtensionFileFilter(String extension, String defaultExtension, String description) {
202 this.extensions = extension;
203 this.defaultExtension = defaultExtension;
204 this.description = description;
205 }
206
207 public boolean acceptName(String filename) {
208 String name = filename.toLowerCase();
209 for (String ext : extensions.split(","))
210 if (name.endsWith("."+ext))
211 return true;
212 return false;
213 }
214
215 @Override public boolean accept(File pathname) {
216 if (pathname.isDirectory())
217 return true;
218 return acceptName(pathname.getName());
219 }
220
221 @Override public String getDescription() {
222 return description;
223 }
224
225 public String getDefaultExtension() {
226 return defaultExtension;
227 }
228
229 /**
230 * Dummy importer that adds the "All Formats"-Filter when opening files
231 */
232 public static class AllFormatsImporter extends FileImporter {
233 public AllFormatsImporter() {
234 super(
235 new ExtensionFileFilter("osm,xml,osm.gz,osm.bz2,osm.bz,gpx,gpx.gz,nmea,nme,nma,txt,wms", "", tr("All Formats")
236 + " (*.gpx *.osm *.nmea ...)"));
237 }
238 @Override public boolean acceptFile(File pathname) {
239 return false;
240 }
241 }
242
243 @Override
244 public int hashCode() {
245 final int prime = 31;
246 int result = 1;
247 result = prime * result + ((defaultExtension == null) ? 0 : defaultExtension.hashCode());
248 result = prime * result + ((description == null) ? 0 : description.hashCode());
249 result = prime * result + ((extensions == null) ? 0 : extensions.hashCode());
250 return result;
251 }
252
253 @Override
254 public boolean equals(Object obj) {
255 if (this == obj)
256 return true;
257 if (obj == null)
258 return false;
259 if (getClass() != obj.getClass())
260 return false;
261 ExtensionFileFilter other = (ExtensionFileFilter) obj;
262 if (defaultExtension == null) {
263 if (other.defaultExtension != null)
264 return false;
265 } else if (!defaultExtension.equals(other.defaultExtension))
266 return false;
267 if (description == null) {
268 if (other.description != null)
269 return false;
270 } else if (!description.equals(other.description))
271 return false;
272 if (extensions == null) {
273 if (other.extensions != null)
274 return false;
275 } else if (!extensions.equals(other.extensions))
276 return false;
277 return true;
278 }
279}
Note: See TracBrowser for help on using the repository browser.