/* ====================================================================
   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 logic which shall be used to calculate the line spacing of the
 * parent object when it is displayed in the document.
 *
 * @author Gisella Bronzetti
 */
public enum LineSpacingRule {

    /**
     * Specifies that the line spacing of the parent object shall be
     * automatically determined by the size of its contents, with no
     * predetermined minimum or maximum size.
     */

    AUTO(1),

    /**
     * Specifies that the height of the line shall be exactly the value
     * specified, regardless of the size of the contents If the contents are too
     * large for the specified height, then they shall be clipped as necessary.
     */
    EXACT(2),

    /**
     * Specifies that the height of the line shall be at least the value
     * specified, but may be expanded to fit its content as needed.
     */
    AT_LEAST(3);


    private static Map<Integer, LineSpacingRule> imap = new HashMap<Integer, LineSpacingRule>();

    static {
        for (LineSpacingRule p : values()) {
            imap.put(p.getValue(), p);
        }
    }

    private final int value;

    private LineSpacingRule(int val) {
        value = val;
    }

    public static LineSpacingRule valueOf(int type) {
        LineSpacingRule lineType = imap.get(type);
        if (lineType == null)
            throw new IllegalArgumentException("Unknown line type: " + type);
        return lineType;
    }

    public int getValue() {
        return value;
    }
}
