//----------------------------------------------------------------------------//
//                                                                            //
//                             F i l t e r K i n d                            //
//                                                                            //
//----------------------------------------------------------------------------//
// <editor-fold defaultstate="collapsed" desc="hdr">                          //
//  Copyright © Hervé Bitteur and others 2000-2013. All rights reserved.      //
//  This software is released under the GNU General Public License.           //
//  Goto http://kenai.com/projects/audiveris to report bugs or suggestions.   //
//----------------------------------------------------------------------------//
// </editor-fold>
package omr.run;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Class {@code FilterKind} handles the various kinds of
 * {@link PixelFilter} implementations.
 */
public enum FilterKind
{

    GLOBAL("Basic filter using a global threshold", GlobalFilter.class),
    ADAPTIVE(
    "Adaptive filter using a local threshold",
    AdaptiveFilter.getImplementationClass());

    /** Description. */
    public final String description;

    /** Implementing class. */
    public final Class<?> classe;

    /** Usual logger utility */
    private static final Logger logger = LoggerFactory.getLogger(
            FilterKind.class);

    //------------//
    // FilterKind //
    //------------//
    FilterKind (String description,
                Class<?> classe)
    {
        this.description = description;
        this.classe = classe;
    }

    //----------//
    // Constant //
    //----------//
    /**
     * Class {@code Constant} is a {@link omr.constant.Constant},
     * meant to store a {@link FilterKind} value.
     */
    public static class Constant
            extends omr.constant.Constant
    {

        /**
         * Specific constructor, where 'unit' and 'name' are assigned later
         *
         * @param defaultValue the default FilterKind value
         * @param description  the semantic of the constant
         */
        public Constant (FilterKind defaultValue,
                         java.lang.String description)
        {
            super(null, defaultValue.toString(), description);
        }

        /**
         * Set a new value to the constant
         *
         * @param val the new FilterKind value
         */
        public void setValue (FilterKind val)
        {
            setTuple(val.toString(), val);
        }

        @Override
        public void setValue (java.lang.String string)
        {
            setValue(decode(string));
        }

        /**
         * Retrieve the current constant value
         *
         * @return the current FilterKind value
         */
        public FilterKind getValue ()
        {
            return (FilterKind) getCachedValue();
        }

        @Override
        protected FilterKind decode (java.lang.String str)
        {
            return FilterKind.valueOf(str);
        }
    }
}
