/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.api.gui.util; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import javax.swing.JFileChooser; import javax.swing.filechooser.FileFilter; import org.weasis.core.api.Messages; import com.sun.media.jai.codec.ImageCodec; /** * The Class FileFormatFilter. * * @author Nicolas Roduit */ public class FileFormatFilter extends FileFilter { private final Map<String, FileFormatFilter> fExtensions; private String fDescription; private String fFullDescription; private String fDefaultExtension; private boolean fUseExtensionsInDescription; protected static Map<String, String> sExtToCodec; static { // extension alternatives : more than one is separated by comma sExtToCodec = new HashMap<>(); sExtToCodec.put("jpg,jpe", "jpeg"); //$NON-NLS-1$ //$NON-NLS-2$ sExtToCodec.put("tif", "tiff"); //$NON-NLS-1$ //$NON-NLS-2$ sExtToCodec.put("pbm,ppm,pgm", "pnm"); //$NON-NLS-1$ //$NON-NLS-2$ } public FileFormatFilter(String extension, String description) { fExtensions = new TreeMap<>(); fDescription = null; fFullDescription = null; fDefaultExtension = null; fUseExtensionsInDescription = true; if (extension != null) { addExtension(extension); } if (description != null) { setDescription(description); } } public FileFormatFilter(String[] filters) { this(filters, null); } public FileFormatFilter(String[] filters, String description) { fExtensions = new TreeMap<>(); fDescription = null; fFullDescription = null; fDefaultExtension = null; fUseExtensionsInDescription = true; for (int i = 0; i < filters.length; i++) { addExtension(filters[i]); } if (description != null) { setDescription(description); } } public String getDefaultExtension() { return fDefaultExtension; } @Override public boolean accept(File f) { if (f != null) { if (f.isDirectory()) { return true; } String extension = getExtension(f); if (extension != null && fExtensions.get(extension) != null) { return true; } } return false; } public String getExtension(File f) { if (f != null) { String filename = f.getName(); int i = filename.lastIndexOf(46); if (i > 0 && i < filename.length() - 1) { return filename.substring(i + 1).toLowerCase(); } } return null; } public void addExtension(String extension) { fExtensions.put(extension.replace('*', ' ').replace('.', ' ').trim().toLowerCase(), this); if (fDefaultExtension == null) { fDefaultExtension = extension; } fFullDescription = null; } @Override public String getDescription() { if (fFullDescription == null) { if (fDescription == null || isExtensionListInDescription()) { fFullDescription = fDescription != null ? fDescription + " (" : "("; //$NON-NLS-1$ //$NON-NLS-2$ Set<String> extensions = fExtensions.keySet(); Iterator<String> it = extensions.iterator(); if (it.hasNext()) { fFullDescription += "*." + it.next(); //$NON-NLS-1$ } while (it.hasNext()) { fFullDescription += ", *." + it.next(); //$NON-NLS-1$ } fFullDescription += ")"; //$NON-NLS-1$ } else { fFullDescription = fDescription; } } return fFullDescription; } public void setDescription(String description) { fDescription = description; fFullDescription = null; } public void setExtensionListInDescription(boolean b) { fUseExtensionsInDescription = b; fFullDescription = null; } public boolean isExtensionListInDescription() { return fUseExtensionsInDescription; } public static void setImageDecodeFilters(JFileChooser chooser) { // Get the current available codecs from ImageIO. Enumeration<?> codecs = ImageCodec.getCodecs(); ArrayList<String> namesList = new ArrayList<>(20); ImageCodec ic; for (; codecs.hasMoreElements(); namesList.add(ic.getFormatName())) { ic = (ImageCodec) codecs.nextElement(); } Collections.sort(namesList); Iterator<String> it = namesList.iterator(); String desc = Messages.getString("FileFormatFilter.all_supported"); //$NON-NLS-1$ ArrayList<String> names = new ArrayList<>(); do { if (!it.hasNext()) { break; } String name = it.next(); names.add(name); String altExt = getAlternateExtension(name); if (altExt != null) { if (altExt.indexOf(",") != -1) { //$NON-NLS-1$ String[] tab = altExt.split(","); //$NON-NLS-1$ for (int i = 0; i < tab.length; i++) { names.add(tab[i]); } } else { names.add(altExt); } } } while (true); FileFormatFilter allfilter = new FileFormatFilter(names.toArray(new String[names.size()]), desc); allfilter.setFFullDescription(desc); chooser.addChoosableFileFilter(allfilter); it = namesList.iterator(); do { if (!it.hasNext()) { break; } String name = it.next(); desc = name.toUpperCase(); FileFormatFilter filter = new FileFormatFilter(name, desc); String altExt = getAlternateExtension(name); if (altExt != null) { if (altExt.indexOf(",") != -1) { //$NON-NLS-1$ String[] tab = altExt.split(","); //$NON-NLS-1$ for (int i = 0; i < tab.length; i++) { filter.addExtension(tab[i]); } } else { filter.addExtension(altExt); } } chooser.addChoosableFileFilter(filter); } while (true); // Add All filter chooser.setAcceptAllFileFilterUsed(true); // Set default selected filter chooser.setFileFilter(allfilter); } public static String getAlternateExtension(String codecName) { Set<Entry<String, String>> maps = sExtToCodec.entrySet(); for (Iterator<Entry<String, String>> it = maps.iterator(); it.hasNext();) { Entry<String, String> me = it.next(); String value = me.getValue(); if (value.equals(codecName)) { return me.getKey(); } } return null; } public void setFFullDescription(String fFullDescription) { this.fFullDescription = fFullDescription; } }