// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.gui.converter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class BamFilterFactory
{
private static final List<FilterInfo> FilterInfoList = new ArrayList<FilterInfo>();
static {
// Registering individual BAM filters
FilterInfoList.add(new FilterInfo(BamFilterColorBCG.getFilterName(),
BamFilterColorBCG.getFilterDesc(),
BamFilterColorBCG.class));
FilterInfoList.add(new FilterInfo(BamFilterColorHSL.getFilterName(),
BamFilterColorHSL.getFilterDesc(),
BamFilterColorHSL.class));
FilterInfoList.add(new FilterInfo(BamFilterColorBalance.getFilterName(),
BamFilterColorBalance.getFilterDesc(),
BamFilterColorBalance.class));
FilterInfoList.add(new FilterInfo(BamFilterColorReplace.getFilterName(),
BamFilterColorReplace.getFilterDesc(),
BamFilterColorReplace.class));
FilterInfoList.add(new FilterInfo(BamFilterColorSwap.getFilterName(),
BamFilterColorSwap.getFilterDesc(),
BamFilterColorSwap.class));
FilterInfoList.add(new FilterInfo(BamFilterColorInvert.getFilterName(),
BamFilterColorInvert.getFilterDesc(),
BamFilterColorInvert.class));
FilterInfoList.add(new FilterInfo(BamFilterTransformResize.getFilterName(),
BamFilterTransformResize.getFilterDesc(),
BamFilterTransformResize.class));
FilterInfoList.add(new FilterInfo(BamFilterTransformRotate.getFilterName(),
BamFilterTransformRotate.getFilterDesc(),
BamFilterTransformRotate.class));
FilterInfoList.add(new FilterInfo(BamFilterTransformMirror.getFilterName(),
BamFilterTransformMirror.getFilterDesc(),
BamFilterTransformMirror.class));
FilterInfoList.add(new FilterInfo(BamFilterTransformTrim.getFilterName(),
BamFilterTransformTrim.getFilterDesc(),
BamFilterTransformTrim.class));
FilterInfoList.add(new FilterInfo(BamFilterOutputDefault.getFilterName(),
BamFilterOutputDefault.getFilterDesc(),
BamFilterOutputDefault.class));
FilterInfoList.add(new FilterInfo(BamFilterOutputSplitted.getFilterName(),
BamFilterOutputSplitted.getFilterDesc(),
BamFilterOutputSplitted.class));
}
/** Returns the number of registered BAM filters. */
public static int getFilterInfoSize()
{
return FilterInfoList.size();
}
/** Returns a FilterInfo object at the specified list index. */
public static FilterInfo getFilterInfo(int index)
{
if (index >= 0 && index < FilterInfoList.size()) {
return FilterInfoList.get(index);
} else {
return null;
}
}
/** Returns a FilterInfo object of the specified name. */
public static FilterInfo getFilterInfo(String filterName)
{
if (filterName != null && !filterName.isEmpty()) {
for (final FilterInfo fi: FilterInfoList) {
if (fi.getName().equalsIgnoreCase(filterName)) {
return fi;
}
}
}
return null;
}
/** Returns a list of all class types compatible with the specified class. */
public static Collection<Class<? extends BamFilterBase>> getFiltersOf(Class<? extends BamFilterBase> classType)
{
Collection<Class<? extends BamFilterBase>> retVal = new ArrayList<Class<? extends BamFilterBase>>();
if (classType != null) {
for (int i = 0; i < FilterInfoList.size(); i++) {
if (classType.isAssignableFrom(FilterInfoList.get(i).getFilterClass())) {
retVal.add(FilterInfoList.get(i).getFilterClass());
}
}
}
return retVal;
}
/**
* Creates an instance of the specified class type.
* @param filterClass The class type to create an instance from.
* @return The filter class instance, or {@code null} on error.
*/
public static BamFilterBase createInstance(ConvertToBam parent, Class<? extends BamFilterBase> filterClass)
{
if (filterClass != null) {
try {
return filterClass.getConstructor(ConvertToBam.class).newInstance(parent);
} catch (Throwable t) {
t.printStackTrace();
}
}
return null;
}
/**
* Creates a normalized filter list based on the specified argument.
* It moves existing output filter to the end of the list. The filter {@code BamFilterOutputDefault}
* will be added to the end of the list if no output filter has been found.
*/
public static List<BamFilterBase> normalizeFilterList(ConvertToBam parent, List<BamFilterBase> filterList)
{
List<BamFilterBase> retList = new ArrayList<BamFilterBase>();
List<BamFilterBase> tmpList = new ArrayList<BamFilterBase>();
if (filterList != null) {
for (int i = 0; i < filterList.size(); i++) {
if (filterList.get(i) instanceof BamFilterBaseOutput) {
tmpList.add(filterList.get(i));
} else {
retList.add(filterList.get(i));
}
}
}
// adding output filters last
if (!tmpList.isEmpty()) {
for (int i = 0; i < tmpList.size(); i++) {
retList.add(tmpList.get(i));
}
} else {
retList.add(BamFilterFactory.createInstance(parent, BamFilterOutputDefault.class));
}
return retList;
}
//-------------------------- INNER CLASSES --------------------------
public static final class FilterInfo implements Comparable<FilterInfo>
{
private final String name;
private final String description;
private final Class<? extends BamFilterBase> filterClass;
public FilterInfo(String name, String desc, Class<? extends BamFilterBase> filterClass)
{
this.name = name;
this.description = desc;
this.filterClass = filterClass;
}
/** Returns the filter name. */
public String getName() { return name; }
/** Returns the filter description. */
public String getDescription() { return description; }
/** Returns the filter class type. */
public Class<? extends BamFilterBase> getFilterClass() { return filterClass; }
@Override
public String toString()
{
return name;
}
@Override
public int compareTo(FilterInfo o)
{
// Sorts by Color->Transform->Output
if (BamFilterBaseColor.class.isAssignableFrom(filterClass)) {
if (BamFilterBaseColor.class.isAssignableFrom(o.filterClass)) {
return 0;
} else {
return -1;
}
} else if (BamFilterBaseTransform.class.isAssignableFrom(filterClass)) {
if (BamFilterBaseColor.class.isAssignableFrom(o.filterClass)) {
return 1;
} else if (BamFilterBaseTransform.class.isAssignableFrom(o.filterClass)) {
return 0;
} else {
return -1;
}
} else {
if (BamFilterBaseOutput.class.isAssignableFrom(o.filterClass)) {
return 0;
} else {
return 1;
}
}
}
}
}