001/***************************************************************************** 002 * Copyright by The HDF Group. * 003 * Copyright by the Board of Trustees of the University of Illinois. * 004 * All rights reserved. * 005 * * 006 * This file is part of the HDF Java Products distribution. * 007 * The full copyright notice, including terms governing use, modification, * 008 * and redistribution, is contained in the files COPYING and Copyright.html. * 009 * COPYING can be found at the root of the source code distribution tree. * 010 * Or, see https://support.hdfgroup.org/products/licenses.html * 011 * If you do not have access to either file, you may request a copy from * 012 * help@hdfgroup.org. * 013 ****************************************************************************/ 014 015package hdf.view; 016 017import java.util.Enumeration; 018import java.util.Hashtable; 019import java.util.StringTokenizer; 020 021/** 022 * A convenience implementation of FileFilter that filters out all files except 023 * for those type extensions that it knows about. 024 * 025 * @author Jordan T. Henderson 026 * @version 2.4 4/27/2016 027 */ 028public class DefaultFileFilter { 029 private Hashtable<String, DefaultFileFilter> filters = null; 030 private String description = null; 031 private String fullDescription = null; 032 private boolean useExtensionsInDescription = true; 033 034 /** 035 * Creates a file filter. If no filters are added, then all files are 036 * accepted. 037 * 038 * @see #addExtension 039 */ 040 public DefaultFileFilter() { 041 this.filters = new Hashtable<>(); 042 } 043 044 /** 045 * Creates a file filter that accepts files with the given extension. 046 * Example: new DefaultFileFilter("jpg"); 047 * 048 * @see #addExtension 049 * 050 * @param extension the file extension to filter on 051 */ 052 public DefaultFileFilter(String extension) { 053 this(extension, null); 054 } 055 056 /** 057 * Creates a file filter that accepts the given file type. Example: new 058 * DefaultFileFilter("jpg", "JPEG Image Images"); 059 * 060 * Note that the "." before the extension is not needed. If provided, it 061 * will be ignored. 062 * 063 * @see #addExtension 064 * 065 * @param extension the file extension to filter on 066 * @param description the file extension full description 067 */ 068 public DefaultFileFilter(String extension, String description) { 069 this(); 070 if (extension != null) { 071 addExtension(extension); 072 } 073 if (description != null) { 074 setDescription(description); 075 } 076 } 077 078 /** 079 * Creates a file filter from the given string array. Example: new 080 * DefaultFileFilter(String {"gif", "jpg"}); 081 * 082 * Note that the "." before the extension is not needed and will be ignored. 083 * 084 * @see #addExtension 085 * 086 * @param filters 087 * the list of filter names 088 */ 089 public DefaultFileFilter(String[] filters) { 090 this(filters, null); 091 } 092 093 /** 094 * Creates a file filter from the given string array and description. 095 * Example: new DefaultFileFilter(String {"gif", "jpg"}, 096 * "Gif and JPG Images"); 097 * 098 * Note that the "." before the extension is not needed and will be ignored. 099 * 100 * @see #addExtension 101 * 102 * @param filters 103 * the list of filter names 104 * @param description 105 * the name of the filter list 106 */ 107 public DefaultFileFilter(String[] filters, String description) { 108 this(); 109 for (int i = 0; i < filters.length; i++) { 110 // add filters one by one 111 addExtension(filters[i]); 112 } 113 if (description != null) { 114 setDescription(description); 115 } 116 } 117 118 /** 119 * @return the file extensions associated with this DefaultFileFilter 120 */ 121 public String getExtensions() { 122 Enumeration<String> extensions = filters.keys(); 123 String extString = ""; 124 125 while (extensions.hasMoreElements()) { 126 extString += "*." + extensions.nextElement() + ";"; 127 } 128 129 return extString; 130 } 131 132 /** 133 * Adds a filetype "dot" extension to filter against. 134 * 135 * For example: the following code will create a filter that filters out all 136 * files except those that end in ".jpg" and ".tif": 137 * 138 * DefaultFileFilter filter = new DefaultFileFilter(); 139 * filter.addExtension("jpg"); filter.addExtension("tif"); or 140 * filter.addExtension("jpg, tif"); 141 * 142 * Note that the "." before the extension is not needed and will be ignored. 143 * 144 * @param extension the file extension to add to the file filter 145 */ 146 public void addExtension(String extension) { 147 if (filters == null) { 148 filters = new Hashtable<>(5); 149 } 150 151 String ext = null; 152 StringTokenizer st = new StringTokenizer(extension, ","); 153 while (st.hasMoreElements()) { 154 ext = st.nextToken().trim(); 155 filters.put(ext.toLowerCase(), this); 156 } 157 158 fullDescription = null; 159 } 160 161 /** 162 * @return the human readable description of this filter. For example: 163 * "JPEG and GIF Image Files (*.jpg, *.gif)" 164 */ 165 public String getDescription() { 166 if (fullDescription == null) { 167 if ((description == null) || isExtensionListInDescription()) { 168 fullDescription = description == null ? "(" : description 169 + " ("; 170 // build the description from the extension list 171 Enumeration<String> extensions = filters.keys(); 172 if (extensions != null) { 173 174 if (!extensions.hasMoreElements()) { 175 fullDescription = null; 176 return null; 177 } 178 179 fullDescription += "." + extensions.nextElement(); 180 while (extensions.hasMoreElements()) { 181 fullDescription += ", " 182 + "." + extensions.nextElement(); 183 } 184 } 185 fullDescription += ")"; 186 } 187 else { 188 fullDescription = description; 189 } 190 } 191 return fullDescription; 192 } 193 194 /** 195 * Sets the human readable description of this filter. For example: 196 * filter.setDescription("Gif and JPG Images"); 197 * 198 * @param description the full description of the file filter 199 */ 200 public void setDescription(String description) { 201 this.description = description; 202 fullDescription = null; 203 } 204 205 /** 206 * Determines whether the extension list (.jpg, .gif, etc) should show up in 207 * the human readable description. 208 * 209 * Only relevent if a description was provided in the constructor or using 210 * setDescription(); 211 * 212 * @param b the show state of the extension list 213 */ 214 public void setExtensionListInDescription(boolean b) { 215 useExtensionsInDescription = b; 216 fullDescription = null; 217 } 218 219 /** 220 * @return whether the extension list (.jpg, .gif, etc) should show up in 221 * the human readable description. 222 * 223 * Only relevent if a description was provided in the constructor or using 224 * setDescription(); 225 */ 226 public boolean isExtensionListInDescription() { 227 return useExtensionsInDescription; 228 } 229 230 /** @return a file filter for HDF4/5 file. */ 231 public static DefaultFileFilter getFileFilter() { 232 // update extensions 233 String fileExtensions = ViewProperties.getFileExtension(); 234 235 DefaultFileFilter filter = new DefaultFileFilter(); 236 filter.setDescription("HDF & more"); 237 238 filter.addExtension(fileExtensions); 239 240 return filter; 241 } 242 243 /** @return a file filter for NetCDF3 file. */ 244 public static DefaultFileFilter getFileFilterNetCDF3() { 245 DefaultFileFilter filter = new DefaultFileFilter(); 246 filter.addExtension("nc"); 247 filter.setDescription("NetCDF3 files"); 248 249 return filter; 250 } 251 252 /** @return a file filter for HDF4 file. */ 253 public static DefaultFileFilter getFileFilterHDF4() { 254 DefaultFileFilter filter = new DefaultFileFilter(); 255 filter.addExtension("hdf"); 256 filter.addExtension("h4"); 257 filter.addExtension("hdf4"); 258 filter.setDescription("HDF4 files"); 259 260 return filter; 261 } 262 263 /** @return a file filter for HDF5 file. */ 264 public static DefaultFileFilter getFileFilterHDF5() { 265 DefaultFileFilter filter = new DefaultFileFilter(); 266 filter.addExtension("h5"); 267 filter.addExtension("hdf5"); 268 filter.setDescription("HDF5 files"); 269 270 return filter; 271 } 272 273 /** @return a file filter for JPEG image files. */ 274 public static DefaultFileFilter getFileFilterJPEG() { 275 DefaultFileFilter filter = new DefaultFileFilter(); 276 filter.addExtension("jpg"); 277 filter.addExtension("jpeg"); 278 filter.addExtension("jpe"); 279 filter.addExtension("jif"); 280 filter.addExtension("jfif"); 281 filter.addExtension("jfi"); 282 filter.setDescription("JPEG images"); 283 284 return filter; 285 } 286 287 /** @return a file filter for TIFF image files. */ 288 public static DefaultFileFilter getFileFilterTIFF() { 289 DefaultFileFilter filter = new DefaultFileFilter(); 290 filter.addExtension("tif"); 291 filter.addExtension("tiff"); 292 filter.setDescription("TIFF images"); 293 294 return filter; 295 } 296 297 /** @return a file filter for PNG image files. */ 298 public static DefaultFileFilter getFileFilterPNG() { 299 DefaultFileFilter filter = new DefaultFileFilter(); 300 filter.addExtension("png"); 301 filter.setDescription("PNG images"); 302 303 return filter; 304 } 305 306 /** @return a file filter for BMP image files. */ 307 public static DefaultFileFilter getFileFilterBMP() { 308 DefaultFileFilter filter = new DefaultFileFilter(); 309 filter.addExtension("bmp"); 310 filter.addExtension("dib"); 311 filter.setDescription("BMP images"); 312 313 return filter; 314 } 315 316 /** @return a file filter for GIF image files. */ 317 public static DefaultFileFilter getFileFilterGIF() { 318 DefaultFileFilter filter = new DefaultFileFilter(); 319 filter.addExtension("gif"); 320 filter.setDescription("GIF images"); 321 322 return filter; 323 } 324 325 /** @return a file filter for GIF, JPEG, BMP, or PNG image files. */ 326 public static DefaultFileFilter getImageFileFilter() { 327 DefaultFileFilter filter = new DefaultFileFilter(); 328 filter.addExtension("jpg"); 329 filter.addExtension("jpeg"); 330 filter.addExtension("jpe"); 331 filter.addExtension("jif"); 332 filter.addExtension("jfif"); 333 filter.addExtension("jfi"); 334 filter.addExtension("png"); 335 filter.addExtension("gif"); 336 filter.addExtension("bmp"); 337 filter.addExtension("dib"); 338 filter.setDescription("GIF, JPEG, BMP, or PNG images"); 339 340 return filter; 341 } 342 343 /** @return a file filter for text file. */ 344 public static DefaultFileFilter getFileFilterText() { 345 DefaultFileFilter filter = new DefaultFileFilter(); 346 filter.addExtension("txt"); 347 filter.addExtension("text"); 348 filter.setDescription("Text"); 349 350 return filter; 351 } 352 353 /** @return a file filter for binary file. */ 354 public static DefaultFileFilter getFileFilterBinary() { 355 DefaultFileFilter filter = new DefaultFileFilter(); 356 filter.addExtension("bin"); 357 filter.setDescription("Binary"); 358 359 return filter; 360 } 361}