All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jexer.bits.Color Maven / Gradle / Ivy

/*
 * Jexer - Java Text User Interface
 *
 * The MIT License (MIT)
 *
 * Copyright (C) 2019 Kevin Lamonte
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 * @author Kevin Lamonte [[email protected]]
 * @version 1
 */
package jexer.bits;

/**
 * A text cell color.
 */
public final class Color {

    // ------------------------------------------------------------------------
    // Constants --------------------------------------------------------------
    // ------------------------------------------------------------------------

    /**
     * SGR black value = 0.
     */
    private static final int SGRBLACK   = 0;

    /**
     * SGR red value = 1.
     */
    private static final int SGRRED     = 1;

    /**
     * SGR green value = 2.
     */
    private static final int SGRGREEN   = 2;

    /**
     * SGR yellow value = 3.
     */
    private static final int SGRYELLOW  = 3;

    /**
     * SGR blue value = 4.
     */
    private static final int SGRBLUE    = 4;

    /**
     * SGR magenta value = 5.
     */
    private static final int SGRMAGENTA = 5;

    /**
     * SGR cyan value = 6.
     */
    private static final int SGRCYAN    = 6;

    /**
     * SGR white value = 7.
     */
    private static final int SGRWHITE   = 7;

    /**
     * Black.  Bold + black = dark grey
     */
    public static final Color BLACK = new Color(SGRBLACK);

    /**
     * Red.
     */
    public static final Color RED = new Color(SGRRED);

    /**
     * Green.
     */
    public static final Color GREEN  = new Color(SGRGREEN);

    /**
     * Yellow.  Sometimes not-bold yellow is brown.
     */
    public static final Color YELLOW = new Color(SGRYELLOW);

    /**
     * Blue.
     */
    public static final Color BLUE = new Color(SGRBLUE);

    /**
     * Magenta (purple).
     */
    public static final Color MAGENTA = new Color(SGRMAGENTA);

    /**
     * Cyan (blue-green).
     */
    public static final Color CYAN = new Color(SGRCYAN);

    /**
     * White.
     */
    public static final Color WHITE = new Color(SGRWHITE);

    // ------------------------------------------------------------------------
    // Variables --------------------------------------------------------------
    // ------------------------------------------------------------------------

    /**
     * The color value.  Default is SGRWHITE.
     */
    private int value = SGRWHITE;

    // ------------------------------------------------------------------------
    // Constructors -----------------------------------------------------------
    // ------------------------------------------------------------------------

    /**
     * Private constructor used to make the static Color instances.
     *
     * @param value the integer Color value
     */
    private Color(final int value) {
        this.value = value;
    }

    // ------------------------------------------------------------------------
    // Color ------------------------------------------------------------------
    // ------------------------------------------------------------------------

    /**
     * Get color value.  Note that these deliberately match the color values
     * of the ECMA-48 / ANSI X3.64 / VT100-ish SGR function ("ANSI colors").
     *
     * @return the value
     */
    public int getValue() {
        return value;
    }

    /**
     * Public constructor returns one of the static Color instances.
     *
     * @param colorName "red", "blue", etc.
     * @return Color.RED, Color.BLUE, etc.
     */
    static Color getColor(final String colorName) {
        String str = colorName.toLowerCase();

        if (str.equals("black")) {
            return Color.BLACK;
        } else if (str.equals("white")) {
            return Color.WHITE;
        } else if (str.equals("red")) {
            return Color.RED;
        } else if (str.equals("cyan")) {
            return Color.CYAN;
        } else if (str.equals("green")) {
            return Color.GREEN;
        } else if (str.equals("magenta")) {
            return Color.MAGENTA;
        } else if (str.equals("blue")) {
            return Color.BLUE;
        } else if (str.equals("yellow")) {
            return Color.YELLOW;
        } else if (str.equals("brown")) {
            return Color.YELLOW;
        } else {
            // Let unknown strings become white
            return Color.WHITE;
        }
    }

    /**
     * Invert a color in the same way as (CGA/VGA color XOR 0x7).
     *
     * @return the inverted color
     */
    public Color invert() {
        switch (value) {
        case SGRBLACK:
            return Color.WHITE;
        case SGRWHITE:
            return Color.BLACK;
        case SGRRED:
            return Color.CYAN;
        case SGRCYAN:
            return Color.RED;
        case SGRGREEN:
            return Color.MAGENTA;
        case SGRMAGENTA:
            return Color.GREEN;
        case SGRBLUE:
            return Color.YELLOW;
        case SGRYELLOW:
            return Color.BLUE;
        default:
            throw new IllegalArgumentException("Invalid Color value: " + value);
        }
    }

    /**
     * Comparison check.  All fields must match to return true.
     *
     * @param rhs another Color instance
     * @return true if all fields are equal
     */
    @Override
    public boolean equals(final Object rhs) {
        if (!(rhs instanceof Color)) {
            return false;
        }

        Color that = (Color) rhs;
        return (value == that.value);
    }

    /**
     * Hashcode uses all fields in equals().
     *
     * @return the hash
     */
    @Override
    public int hashCode() {
        return value;
    }

    /**
     * Make human-readable description of this Color.
     *
     * @return displayable String "red", "blue", etc.
     */
    @Override
    public String toString() {
        switch (value) {
        case SGRBLACK:
            return "black";
        case SGRWHITE:
            return "white";
        case SGRRED:
            return "red";
        case SGRCYAN:
            return "cyan";
        case SGRGREEN:
            return "green";
        case SGRMAGENTA:
            return "magenta";
        case SGRBLUE:
            return "blue";
        case SGRYELLOW:
            return "yellow";
        default:
            throw new IllegalArgumentException("Invalid Color value: " + value);
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy