/* ====================================================================
   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 set of possible restart locations which may be used as to
 * determine the next available line when a break's type attribute has a value
 * of textWrapping.
 */
public enum BreakClear {

    /**
     * Specifies that the text wrapping break shall advance the text to the next
     * line in the WordprocessingML document, regardless of its position left to
     * right or the presence of any floating objects which intersect with the
     * line,
     * <p>
     * This is the setting for a typical line break in a document.
     */

    NONE(1),

    /**
     * Specifies that the text wrapping break shall behave as follows:
     * <ul>
     * <li> If this line is broken into multiple regions (a floating object in
     * the center of the page has text wrapping on both sides:
     * <ul>
     * <li> If this is the leftmost region of text flow on this line, advance
     * the text to the next position on the line </li>
     * <li>Otherwise, treat this as a text wrapping break of type all. </li>
     * </ul>
     * </li>
     * <li> If this line is not broken into multiple regions, then treat this
     * break as a text wrapping break of type none. </li>
     * <li> If the parent paragraph is right to left, then these behaviors are
     * also reversed. </li>
     * </ul>
     */
    LEFT(2),

    /**
     * Specifies that the text wrapping break shall behave as follows:
     * <ul>
     * <li> If this line is broken into multiple regions (a floating object in
     * the center of the page has text wrapping on both sides:
     * <ul>
     * <li> If this is the rightmost region of text flow on this line, advance
     * the text to the next position on the next line </li>
     * <li> Otherwise, treat this as a text wrapping break of type all. </li>
     * </ul>
     * <li> If this line is not broken into multiple regions, then treat this
     * break as a text wrapping break of type none. </li>
     * <li> If the parent paragraph is right to left, then these beha viors are
     * also reversed. </li>
     * </ul>
     */
    RIGHT(3),

    /**
     * Specifies that the text wrapping break shall advance the text to the next
     * line in the WordprocessingML document which spans the full width of the
     * line.
     */
    ALL(4);

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

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

    private final int value;

    BreakClear(int val) {
        value = val;
    }

    public static BreakClear valueOf(int type) {
        BreakClear bType = imap.get(type);
        if (bType == null)
            throw new IllegalArgumentException("Unknown break clear type: "
                    + type);
        return bType;
    }

    public int getValue() {
        return value;
    }
}
