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

Last change on this file since 2029 was 2029, checked in by Gubaer, 15 years ago

fixed #3362: "All formats" is added twice to format selections in open dialog

  • Property svn:eol-style set to native
File size: 8.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 = new ArrayList<FileImporter>(Arrays.asList(new OsmImporter(),
40 new OsmGzipImporter(), new OsmBzip2Importer(), new GpxImporter(), new NMEAImporter(), new AllFormatsImporter()));
41
42 public static ArrayList<FileExporter> exporters = new ArrayList<FileExporter>(Arrays.asList(new GpxExporter(),
43 new OsmExporter(), new OsmGzipExporter(), new OsmBzip2Exporter()));
44
45
46 private final String extensions;
47 private final String description;
48 /**
49 * @deprecated use {@see #getDefaultExtension()
50 */
51 @Deprecated
52 public final String defaultExtension;
53
54
55 static protected void sort(List<ExtensionFileFilter> filters) {
56 Collections.sort(
57 filters,
58 new Comparator<ExtensionFileFilter>() {
59 private AllFormatsImporter all = new AllFormatsImporter();
60 public int compare(ExtensionFileFilter o1, ExtensionFileFilter o2) {
61 if (o1.getDescription().equals(all.filter.getDescription())) return 1;
62 if (o2.getDescription().equals(all.filter.getDescription())) return -1;
63 return o1.getDescription().compareTo(o2.getDescription());
64 }
65 }
66 );
67 }
68
69 /**
70 * Replies an ordered list of {@see ExtensionFileFilter}s for importing.
71 * The list is ordered according to their description, an {@see AllFormatsImporter}
72 * is append at the end.
73 *
74 * @return an ordered list of {@see ExtensionFileFilter}s for importing.
75 */
76 public static List<ExtensionFileFilter> getImportExtensionFileFilters() {
77 LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
78 for (FileImporter importer : importers) {
79 if (filters.contains(importer.filter)) {
80 continue;
81 }
82 filters.add(importer.filter);
83 }
84 sort(filters);
85 return filters;
86 }
87
88 /**
89 * Replies an ordered list of {@see ExtensionFileFilter}s for exporting.
90 * The list is ordered according to their description, an {@see AllFormatsImporter}
91 * is append at the end.
92 *
93 * @return an ordered list of {@see ExtensionFileFilter}s for exporting.
94 */
95 public static List<ExtensionFileFilter> getExportExtensionFileFilters() {
96 LinkedList<ExtensionFileFilter> filters = new LinkedList<ExtensionFileFilter>();
97 for (FileExporter exporter : exporters) {
98 if (filters.contains(exporter.filter)) {
99 continue;
100 }
101 filters.add(exporter.filter);
102 }
103 sort(filters);
104 return filters;
105 }
106
107 /**
108 * Replies the default {@see ExtensionFileFilter} for a given extension
109 *
110 * @param extension the extension
111 * @return the default {@see ExtensionFileFilter} for a given extension
112 */
113 public static ExtensionFileFilter getDefaultImportExtensionFileFilter(String extension) {
114 if (extension == null) return new AllFormatsImporter().filter;
115 for (FileImporter importer : importers) {
116 if (extension.equals(importer.filter.getDefaultExtension()))
117 return importer.filter;
118 }
119 return new AllFormatsImporter().filter;
120 }
121
122 /**
123 * Replies the default {@see ExtensionFileFilter} for a given extension
124 *
125 * @param extension the extension
126 * @return the default {@see ExtensionFileFilter} for a given extension
127 */
128 public static ExtensionFileFilter getDefaultExportExtensionFileFilter(String extension) {
129 if (extension == null) return new AllFormatsImporter().filter;
130 for (FileExporter exporter : exporters) {
131 if (extension.equals(exporter.filter.getDefaultExtension()))
132 return exporter.filter;
133 }
134 return new AllFormatsImporter().filter;
135 }
136
137 /**
138 * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
139 * file chooser for selecting a file for reading.
140 *
141 * @param fileChooser the file chooser
142 * @param extension the default extension
143 */
144 public static void applyChoosableImportFileFilters(JFileChooser fileChooser, String extension) {
145 for (ExtensionFileFilter filter: getImportExtensionFileFilters()) {
146 fileChooser.addChoosableFileFilter(filter);
147 }
148 fileChooser.setFileFilter(getDefaultImportExtensionFileFilter(extension));
149 }
150
151 /**
152 * Applies the choosable {@see FileFilter} to a {@see JFileChooser} before using the
153 * file chooser for selecting a file for writing.
154 *
155 * @param fileChooser the file chooser
156 * @param extension the default extension
157 */
158 public static void applyChoosableExportFileFilters(JFileChooser fileChooser, String extension) {
159 for (ExtensionFileFilter filter: getExportExtensionFileFilters()) {
160 fileChooser.addChoosableFileFilter(filter);
161 }
162 fileChooser.setFileFilter(getDefaultExportExtensionFileFilter(extension));
163 }
164
165 /**
166 * Construct an extension file filter by giving the extension to check after.
167 */
168 public ExtensionFileFilter(String extension, String defaultExtension, String description) {
169 this.extensions = extension;
170 this.defaultExtension = defaultExtension;
171 this.description = description;
172 }
173
174 public boolean acceptName(String filename) {
175 String name = filename.toLowerCase();
176 for (String ext : extensions.split(","))
177 if (name.endsWith("."+ext))
178 return true;
179 return false;
180 }
181
182 @Override public boolean accept(File pathname) {
183 if (pathname.isDirectory())
184 return true;
185 return acceptName(pathname.getName());
186 }
187
188 @Override public String getDescription() {
189 return description;
190 }
191
192 public String getDefaultExtension() {
193 return defaultExtension;
194 }
195
196 /**
197 * Dummy importer that adds the "All Formats"-Filter when opening files
198 */
199 public static class AllFormatsImporter extends FileImporter {
200 public AllFormatsImporter() {
201 super(
202 new ExtensionFileFilter("osm,xml,osm.gz,osm.bz2,osm.bz,gpx,gpx.gz,nmea,nme,nma,txt,wms", "", tr("All Formats")
203 + " (*.gpx *.osm *.nmea ...)"));
204 }
205 @Override public boolean acceptFile(File pathname) {
206 return false;
207 }
208 }
209
210 @Override
211 public int hashCode() {
212 final int prime = 31;
213 int result = 1;
214 result = prime * result + ((defaultExtension == null) ? 0 : defaultExtension.hashCode());
215 result = prime * result + ((description == null) ? 0 : description.hashCode());
216 result = prime * result + ((extensions == null) ? 0 : extensions.hashCode());
217 return result;
218 }
219
220 @Override
221 public boolean equals(Object obj) {
222 if (this == obj)
223 return true;
224 if (obj == null)
225 return false;
226 if (getClass() != obj.getClass())
227 return false;
228 ExtensionFileFilter other = (ExtensionFileFilter) obj;
229 if (defaultExtension == null) {
230 if (other.defaultExtension != null)
231 return false;
232 } else if (!defaultExtension.equals(other.defaultExtension))
233 return false;
234 if (description == null) {
235 if (other.description != null)
236 return false;
237 } else if (!description.equals(other.description))
238 return false;
239 if (extensions == null) {
240 if (other.extensions != null)
241 return false;
242 } else if (!extensions.equals(other.extensions))
243 return false;
244 return true;
245 }
246}
Note: See TracBrowser for help on using the repository browser.