/* ====================================================================
   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>
     * </ul>
     * <li> If the parent paragraph is right to left, then these behaviors are
     * also reversed. </li>
     */
    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 Map<Integer, BreakClear> imap = new HashMap<>();

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

    private final int value;

    private 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;
    }
}
