package net.bull.javamelody.swing.print;
import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.swing.filechooser.FileFilter;
/**
* A convenience implementation of FileFilter that filters out all files except for those type extensions that it knows about.
*
* Extensions are of the type ".foo", which is typically found on Windows and Unix boxes, but not on Macinthosh. Case is ignored.
*
* Example - create a new filter that filters out all files but gif and jpg image files:
*
* <code>
* JFileChooser chooser = new JFileChooser();
* MExtensionFileFilter filter = new MExtensionFileFilter(
* new String{"gif", "jpg"}, "JPEG & GIF Images")
* chooser.addChoosableFileFilter(filter);
* chooser.showOpenDialog(this);
* </code>
*
* @author Jeff Dinkins, Sun
*/
public class MExtensionFileFilter extends FileFilter {
private Map<String, MExtensionFileFilter> filters;
private String description;
private String fullDescription;
private boolean useExtensionsInDescription = true;
/**
* Creates a file filter. If no filters are added, then all files are accepted.
*
* @see #addExtension
*/
public MExtensionFileFilter() {
super();
this.filters = new HashMap<>(0);
}
/**
* Creates a file filter from the given string array and description. Example: new MExtensionFileFilter(String {"gif", "jpg"}, "Gif and JPG Images");
*
* Note that the "." before the extension is not needed and will be ignored.
*
* @param newFilters
* String[]
* @param newDescription
* String, may be null
* @see #addExtension
*/
public MExtensionFileFilter(final String[] newFilters, final String newDescription) {
this();
for (final String filter : newFilters) {
// add filters one by one
addExtension(filter);
}
if (newDescription != null) {
setDescription(newDescription);
}
}
/**
* Creates a file filter that accepts files with the given extension. Example: new MExtensionFileFilter("jpg");
*
* @param extension
* String
* @see #addExtension
*/
public MExtensionFileFilter(final String extension) {
this(extension, null);
}
/**
* Creates a file filter that accepts the given file type. Example: new MExtensionFileFilter("jpg", "JPEG Image Images");
*
* Note that the "." before the extension is not needed. If provided, it will be ignored.
*
* @param extension
* String
* @param newDescription
* String
* @see #addExtension
*/
public MExtensionFileFilter(final String extension, final String newDescription) {
this();
if (extension != null) {
addExtension(extension);
}
if (newDescription != null) {
setDescription(newDescription);
}
}
/**
* Return true if this file should be shown in the directory pane, false if it shouldn't.
*
* Files that begin with "." are ignored.
*
* @return boolean
* @param file
* File
* @see #getExtension
* @see javax.swing.filechooser.FileFilter#accept
*/
@Override
public boolean accept(final File file) {
if (file != null) {
if (file.isDirectory()) {
return true;
}
final String extension = getExtension(file);
if (extension != null && filters.containsKey(extension)) {
return true;
}
}
return false;
}
/**
* Adds a filetype "dot" extension to filter against.
*
* For example: the following code will create a filter that filters out all files except those that end in ".jpg" and ".tif":
*
* MExtensionFileFilter filter = new MExtensionFileFilter(); filter.addExtension("jpg"); filter.addExtension("tif");
*
* Note that the "." before the extension is not needed and will be ignored.
*
* @param extension
* String
*/
public final void addExtension(final String extension) {
if (filters == null) {
filters = new HashMap<>(1);
}
filters.put(extension.toLowerCase(Locale.getDefault()), this);
fullDescription = null;
}
/**
* Returns the human readable description of this filter. For example: "JPEG and GIF Image Files (*.jpg, *.gif)"
*
* @return String
* @see #setDescription
* @see #setExtensionListInDescription
* @see #isExtensionListInDescription
* @see javax.swing.filechooser.FileFilter#getDescription
*/
@Override
public String getDescription() {
if (fullDescription == null) {
final String temp;
if (description == null || isExtensionListInDescription()) {
final StringBuilder sb = new StringBuilder();
sb.append(description == null ? "(" : description + " (");
// build the description from the extension list
boolean first = true;
for (final String filterKey : filters.keySet()) {
if (first) {
first = false;
} else {
sb.append(", ");
}
sb.append("*.");
sb.append(filterKey);
}
sb.append(')');
temp = sb.toString();
} else {
temp = description;
}
// Command Query Separation with lazy initialization : set fullDescription only once
fullDescription = temp;
}
return fullDescription;
}
/**
* Return the extension portion of the file's name.
*
* @return String
* @param file
* File
*/
public String getExtension(final File file) {
if (file != null) {
final String fileName = file.getName();
final int i = fileName.lastIndexOf('.');
if (i > 0 && i < fileName.length() - 1) {
return fileName.substring(i + 1).toLowerCase();
}
}
return null;
}
/**
* Returns whether the extension list (.jpg, .gif, etc) should show up in the human readable description.
*
* Only relevent if a description was provided in the constructor or using setDescription();
*
* @return boolean
* @see #getDescription
* @see #setDescription
* @see #setExtensionListInDescription
*/
public boolean isExtensionListInDescription() {
return useExtensionsInDescription;
}
/**
* Sets the human readable description of this filter. For example: filter.setDescription("Gif and JPG Images");
*
* @param newDescription
* String
* @see #getDescription
* @see #setExtensionListInDescription
* @see #isExtensionListInDescription
*/
public final void setDescription(final String newDescription) {
this.description = newDescription;
fullDescription = null;
}
/**
* Determines whether the extension list (.jpg, .gif, etc) should show up in the human readable description.
*
* Only relevent if a description was provided in the constructor or using setDescription();
*
* @param bool
* boolean
* @see #getDescription
* @see #setDescription
* @see #isExtensionListInDescription
*/
public void setExtensionListInDescription(final boolean bool) {
useExtensionsInDescription = bool;
fullDescription = null;
}
}