/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */
package org.apache.poi.xwpf.usermodel;

import java.util.HashMap;
import java.util.Map;

/**
 * Specifies the types of patterns which may be used to create the underline
 * applied beneath the text in a run.
 *
 * @author Gisella Bronzetti
 */
public enum UnderlinePatterns {

    /**
     * Specifies an underline consisting of a single line beneath all characters
     * in this run.
     */
    SINGLE(1),

    /**
     * Specifies an underline consisting of a single line beneath all non-space
     * characters in the run. There shall be no underline beneath any space
     * character (breaking or non-breaking).
     */
    WORDS(2),

    /**
     * Specifies an underline consisting of two lines beneath all characters in
     * this run
     */
    DOUBLE(3),

    /**
     * Specifies an underline consisting of a single thick line beneath all
     * characters in this run.
     */
    THICK(4),

    /**
     * Specifies an underline consisting of a series of dot characters beneath
     * all characters in this run.
     */
    DOTTED(5),

    /**
     * Specifies an underline consisting of a series of thick dot characters
     * beneath all characters in this run.
     */
    DOTTED_HEAVY(6),

    /**
     * Specifies an underline consisting of a dashed line beneath all characters
     * in this run.
     */
    DASH(7),

    /**
     * Specifies an underline consisting of a series of thick dashes beneath all
     * characters in this run.
     */
    DASHED_HEAVY(8),

    /**
     * Specifies an underline consisting of long dashed characters beneath all
     * characters in this run.
     */
    DASH_LONG(9),

    /**
     * Specifies an underline consisting of thick long dashed characters beneath
     * all characters in this run.
     */
    DASH_LONG_HEAVY(10),

    /**
     * Specifies an underline consisting of a series of dash, dot characters
     * beneath all characters in this run.
     */
    DOT_DASH(11),

    /**
     * Specifies an underline consisting of a series of thick dash, dot
     * characters beneath all characters in this run.
     */
    DASH_DOT_HEAVY(12),

    /**
     * Specifies an underline consisting of a series of dash, dot, dot
     * characters beneath all characters in this run.
     */
    DOT_DOT_DASH(13),

    /**
     * Specifies an underline consisting of a series of thick dash, dot, dot
     * characters beneath all characters in this run.
     */
    DASH_DOT_DOT_HEAVY(14),

    /**
     * Specifies an underline consisting of a single wavy line beneath all
     * characters in this run.
     */
    WAVE(15),

    /**
     * Specifies an underline consisting of a single thick wavy line beneath all
     * characters in this run.
     */
    WAVY_HEAVY(16),

    /**
     * Specifies an underline consisting of a pair of wavy lines beneath all
     * characters in this run.
     */
    WAVY_DOUBLE(17),

    /**
     * Specifies no underline beneath this run.
     */
    NONE(18);

    private static Map<Integer, UnderlinePatterns> imap = new HashMap<Integer, UnderlinePatterns>();

    static {
        for (UnderlinePatterns p : values()) {
            imap.put(p.getValue(), p);
        }
    }

    private final int value;

    private UnderlinePatterns(int val) {
        value = val;
    }

    public static UnderlinePatterns valueOf(int type) {
        UnderlinePatterns align = imap.get(type);
        if (align == null)
            throw new IllegalArgumentException("Unknown underline pattern: "
                    + type);
        return align;
    }

    public int getValue() {
        return value;
    }
}
