/* ====================================================================
   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.
 *
 * @author Gisella Bronzetti
 */
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;
    }
}
