/**
* This file is part of muCommander, http://www.mucommander.com
* Copyright (C) 2002-2016 Maxence Bernard
*
* muCommander is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* muCommander is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.mucommander.commons.file.filter;
import com.mucommander.commons.file.AbstractFile;
/**
* <code>AttributeFileFilter</code> matches files which have a specific attribute set.
* Here's a list of supported file attributes:
* <ul>
* <li>{@link #DIRECTORY}</li>
* <li>{@link #FILE}</li>
* <li>{@link #BROWSABLE}</li>
* <li>{@link #ARCHIVE}</li>
* <li>{@link #SYMLINK}</li>
* <li>{@link #HIDDEN}</li>
* <li>{@link #ROOT}</li>
* </ul>
*
* <p>Only one attribute can be matched at a time. To match several attributes, combine them using a
* {@link com.mucommander.commons.file.filter.ChainedFileFilter}.</p>
*
* @author Maxence Bernard
*/
public class AttributeFileFilter extends AbstractFileFilter {
public enum FileAttribute {
/** Tests if the file is a {@link com.mucommander.commons.file.AbstractFile#isDirectory() directory}. */
DIRECTORY,
/** Tests if the file is a regular file, i.e. not a directory. This is equivalent to negating {@link #DIRECTORY}. */
FILE,
/** Tests if the file is {@link com.mucommander.commons.file.AbstractFile#isBrowsable() browsable}. */
BROWSABLE,
/** Tests if the file is an {@link com.mucommander.commons.file.AbstractFile#isArchive() archive}. */
ARCHIVE,
/** Tests if the file is a {@link com.mucommander.commons.file.AbstractFile#isSymlink() symlink}. */
SYMLINK,
/** Tests if the file is {@link com.mucommander.commons.file.AbstractFile#isHidden() hidden}. */
HIDDEN,
/** Tests if the file is a {@link com.mucommander.commons.file.AbstractFile#isRoot() root folder}. */
ROOT,
/** Tests if the file is a {@link com.mucommander.commons.file.AbstractFile#isSystem() system file}. */
SYSTEM;
}
/** The attribute to test files against */
private FileAttribute attribute;
/**
* Creates a new <code>AttributeFileFilter</code> matching files that have the specified attribute set and operating
* in non-inverted mode.
*
* @param attribute the attribute to test files against
*/
public AttributeFileFilter(FileAttribute attribute) {
this(attribute, false);
}
/**
* Creates a new <code>AttributeFileFilter</code> matching files that have the specified attribute set and operating
* in the specified mode.
*
* @param attribute the attribute to test files against
* @param inverted if true, this filter will operate in inverted mode.
*/
public AttributeFileFilter(FileAttribute attribute, boolean inverted) {
super(inverted);
this.attribute = attribute;
}
/**
* Returns the attribute which files are tested against.
*
* @return the attribute which files are tested against.
*/
public FileAttribute getAttribute() {
return attribute;
}
/**
* Sets the attribute which files are tested against.
*
* @param attribute the attribute which files are tested against.
*/
public void setAttribute(FileAttribute attribute) {
this.attribute = attribute;
}
///////////////////////////////
// FileFilter implementation //
///////////////////////////////
public boolean accept(AbstractFile file) {
switch(attribute) {
case DIRECTORY:
return file.isDirectory();
case FILE:
return !file.isDirectory();
case BROWSABLE:
return file.isBrowsable();
case ARCHIVE:
return file.isArchive();
case SYMLINK:
return file.isSymlink();
case HIDDEN:
return file.isHidden();
case ROOT:
return file.isRoot();
case SYSTEM:
return file.isSystem();
default:
return true;
}
}
}