package edu.princeton.cs.algs4.growingtree.framework;
/*
 * @(#)PaintSettings.java
 *
 * Last Modified: 9/01/02
 */
 import java.util.*;
 import java.lang.*;
 import java.awt.*;
 import java.awt.font.*;
 import java.awt.geom.*;
/** * The class provides an object that refers to the settings of a paint color.
	* It presents Strings for every color defined in Color. It also adds
	* some new colors and presents Strings for those. Then, the class simply converts between Strings
	* and colors.
	*
 	* @author  Corey Sanders
	* @version 2.0 9/01/02
 	*/
 public class PaintSettings extends Object implements Cloneable {
	/********************/
	/* Static variables */
	/********************/
	/**
	 * Dark Blue. RGB = (13,30,125).
	 */
	final public static Color darkBlue = new Color(13, 30, 125);
	/**
	 * Gray blue. RGB = (72,70,157).
	 */
	final public static Color grayBlue = new Color(72, 70, 157);
	/**
	 * Gray red. RGB = (205, 158, 158).
	 */
	final public static Color grayRed = new Color(205, 158, 158);
	/**
	 * Gray green. RGB = (88, 110, 84).
	 */
	final public static Color grayGreen = new Color(88, 110, 84);
	/**
	 * Light Green. RGB = (90,120,20).
	 */
	final public static Color lightGreen = new Color(90, 120, 20);
	/**
	 * Dark Green. RGB = (22,84,22).
	 */
	final public static Color darkGreen = new Color(22, 84, 22);
	/**
	 * Yellow Green. RGB = (142,190,47).
	 */
	final public static Color yellowGreen = new Color(142,190,47);
	/**
	 * Light white (darker than Color.white). RGB = (231,231,231).
	 */
	final public static Color lightWhite = new Color(231, 231, 231);
	/**
	 * Light Gray (lighter than Color.gray). RGB = (150,150,150).
	 */
	final public static Color lighterGray = new Color(150, 150, 150);
	/**
	 * Princeton Orange. RGB = (215, 71, 33).
	 */
	final public static Color princetonOrange = new Color(215,71,33);
	/**
	 * Ghostly Gray. RGB = (217, 217, 223).
	 */
	final public static Color ghostlyGray = new Color(217,217,223);
	/**
	 * Aqua. RGB = (40,218,174).
	 */
	final public static Color aqua = new Color(40,218,174);
	/**
	 * Dark Orange. RGB = (161,120,41).
	 */
	final public static Color darkOrange = new Color(161,120,41);
	/**
	 * Brown. RGB = (161,120,41).
	 */
	final public static Color brown = new Color(81,60,21);
	/**
	 * Indigo. RGB = (92,40,170).
	 */
	final public static Color indigo = new Color(92,40,170);
    final public static Color bookRed = new Color(173,32,24);
    final public static String BOOK_RED = "Book Red";
	/**
	 * The color dark blue.
	 */
	final public static String DARK_BLUE = "Dark Blue";
	/**
	 * The color dark green.
	 */
	final public static String DARK_GREEN = "Dark Green";
	/**
	 * The color ghostly gray.
	 */
	final public static String GHOSTLY_GRAY = "Ghostly Gray";
	/**
	 * The color gray blue.
	 */
	final public static String GRAY_BLUE = "Gray Blue";
	/**
	 * The color gray green.
	 */
	final public static String GRAY_GREEN = "Gray Green";
	/**
	 * The color gray red.
	 */
	final public static String GRAY_RED = "Gray Red";
	/**
	 * The color indigo.
	 */
	final public static String INDIGO = "Indigo";
	/**
	 * The color aqua.
	 */
	final public static String AQUA = "Aqua";
	/**
	 * The color light green.
	 */
	final public static String LIGHT_GREEN = "Light Green";
	/**
	 * The color light white.
	 */
	final public static String LIGHT_WHITE = "Light White";
	/**
	 * The color lighter gray.
	 */
	final public static String LIGHTER_GRAY = "Lighter Gray";
	/**
	 * The color princeton orange.
	 */
	final public static String PRINCETON_ORANGE = "Princeton Orange";
	/**
	 * The color dark orange.
	 */
	final public static String DARK_ORANGE = "Dark Orange";
	/**
	 * The color yellow green.
	 */
	final public static String YELLOW_GREEN = "Yellow Green";
	/**
	 * The color black.
	 */
	final public static String BLACK = "Black";
	/**
	 * The color blue.
	 */
	final public static String BLUE = "Blue";
	/**
	 * The color cyan.
	 */
	final public static String CYAN = "Cyan";
	/**
	 * The color dark gray.
	 */
	final public static String DARK_GRAY = "Dark Gray";
	/**
	 * The color gray.
	 */
	final public static String GRAY = "Gray";
	/**
	 * The color green.
	 */
	final public static String GREEN = "Green";
	/**
	 * The color light gray.
	 */
	final public static String LIGHT_GRAY = "Light Gray";
	/**
	 * The color magenta.
	 */
	final public static String MAGENTA = "Magenta";
	/**
	 * The color orange.
	 */
	final public static String ORANGE = "Orange";
	/**
	 * The color pink.
	 */
	final public static String PINK = "Pink";
	/**
	 * The color red.
	 */
	final public static String RED = "Red";
	/**
	 * The color white.
	 */
	final public static String WHITE = "White";
	/**
	 * The color yellow.
	 */
	final public static String YELLOW = "Yellow";
	/**************/
	/* Variables  */
	/**************/
	/**
	 * String defining the type of PaintSettings the current node is.
	 */
	private String settingName = WHITE;
	/**
	 * Paint for the settings.
	 */
	private Paint paint;
	/***************/
	/* Constructor */
	/***************/
	/**
	 * Constructor, contructs a default defined NodeSettings.
	 */
	public PaintSettings() {
		this.setScheme(WHITE);
	}
	/**
	 * Constructor, contructs a defined NodeSettings with the given scheme.
	 *
	 * @param int scheme, defining the scheme of this NodeSettings.
	 */
	public PaintSettings(String scheme) {
		this.setScheme(scheme);
	}
	/*******************/
	/* Static Methods  */
	/*******************/
	/**
	 * Gets a PaintSettings that defines the given String scheme.
	 *
	 * @param s defined color scheme within the class.
	 *
	 * @return PaintSettings that defines the given color scheme or default if no
	 * color scheme exists.
	 */
	public static PaintSettings getScheme(String s) {
		PaintSettings settings = new PaintSettings();
		settings.setScheme(s);
		return settings;
	}
	/**
	 * Gets an array of String elements representing every PaintSettings choice available.
	 *
	 * @return String[] that represents the list of PaintSettings strings.
	 */
	 public static String[] getList() {
		String[] list = {BLACK,BLUE, CYAN,DARK_GRAY, GRAY, GREEN,LIGHT_GRAY, MAGENTA, ORANGE,
		PINK, RED, WHITE, YELLOW, DARK_BLUE, LIGHT_GREEN, LIGHT_WHITE, LIGHTER_GRAY,
		PRINCETON_ORANGE, AQUA, GHOSTLY_GRAY, GRAY_GREEN, DARK_GREEN, GRAY_RED, GRAY_BLUE, INDIGO, YELLOW_GREEN};
		return list;
	}
	/**
	 * Gets the paint for the given String s NodeSettings that defines the given int scheme. The scheme must be one
	 * defined within the class, otherwise the default scheme is returned.
	 *
	 * @param s defined color scheme within the class.
	 *
	 * @return NodeSettings that defines the given color scheme or default if no
	 * color scheme exists.
	 */
	public static Paint getPaint(String s) {
        if (s.equals(BOOK_RED))
            return bookRed;
		if (s.equals(DARK_BLUE)) {
			return darkBlue;
		}
		if (s.equals(AQUA)) {
			return aqua;
		}
		if (s.equals(GHOSTLY_GRAY)) {
			return ghostlyGray;
		}
		if (s.equals(GRAY_GREEN)) {
			return grayGreen;
		}
		if (s.equals(GRAY_RED)) {
			return grayRed;
		}
		if (s.equals(GRAY_BLUE)) {
			return grayBlue;
		}
		if (s.equals(INDIGO)) {
			return indigo;
		}
		if (s.equals(YELLOW_GREEN)) {
			return yellowGreen;
		}
		if (s.equals(DARK_GREEN)) {
			return darkGreen;
		}
		if (s.equals(PRINCETON_ORANGE)) {
			return princetonOrange;
		}
		if (s.equals(LIGHTER_GRAY)) {
			return lighterGray;
		}
		if (s.equals(LIGHT_WHITE)) {
			return lightWhite;
		}
		if (s.equals(LIGHT_GREEN)) {
			return lightGreen;
		}
		if (s.equals(BLACK)) {
			return Color.black;
		}
		if (s.equals(BLUE)) {
			return Color.blue;
		}
		if (s.equals(CYAN)) {
			return Color.cyan;
		}
		if (s.equals(DARK_GRAY)) {
			return Color.darkGray;
		}
		if (s.equals(GRAY)) {
			return Color.gray;
		}
		if (s.equals(GREEN)) {
			return Color.green;
		}
		if (s.equals(LIGHT_GRAY)) {
			return Color.lightGray;
		}
		if (s.equals(MAGENTA)) {
			return Color.magenta;
		}
		if (s.equals(ORANGE)) {
			return Color.orange;
		}
		if (s.equals(PINK)) {
			return Color.pink;
		}
		if (s.equals(RED)) {
			return bookRed;
		}
		if (s.equals(WHITE)) {
			return Color.white;
		}
		if (s.equals(YELLOW)) {
			return Color.yellow;
		}
		return Color.white;
	}
	/**
	 * Gets a NodeSettings that defines the given int scheme. The scheme must be one
	 * defined within the class, otherwise the default scheme is returned.
	 *
	 * @param s defined color scheme within the class.
	 *
	 * @return NodeSettings that defines the given color scheme or default if no
	 * color scheme exists.
	 */
	public static Color getColor(String s) {
        if (s.equals(BOOK_RED))
            return bookRed;
		if (s.equals(DARK_BLUE)) {
			return darkBlue;
		}
		if (s.equals(AQUA)) {
			return aqua;
		}
		if (s.equals(GHOSTLY_GRAY)) {
			return ghostlyGray;
		}
		if (s.equals(GRAY_GREEN)) {
			return grayGreen;
		}
		if (s.equals(GRAY_RED)) {
			return grayRed;
		}
		if (s.equals(GRAY_BLUE)) {
			return grayBlue;
		}
		if (s.equals(INDIGO)) {
			return indigo;
		}
		if (s.equals(YELLOW_GREEN)) {
			return yellowGreen;
		}
		if (s.equals(DARK_GREEN)) {
			return darkGreen;
		}
		if (s.equals(PRINCETON_ORANGE)) {
			return princetonOrange;
		}
		if (s.equals(LIGHTER_GRAY)) {
			return lighterGray;
		}
		if (s.equals(LIGHT_WHITE)) {
			return lightWhite;
		}
		if (s.equals(LIGHT_GREEN)) {
			return lightGreen;
		}
		if (s.equals(DARK_ORANGE)) {
			return darkOrange;
		}
		if (s.equals(BLACK)) {
			return Color.black;
		}
		if (s.equals(BLUE)) {
			return Color.blue;
		}
		if (s.equals(CYAN)) {
			return Color.cyan;
		}
		if (s.equals(DARK_GRAY)) {
			return Color.darkGray;
		}
		if (s.equals(GRAY)) {
			return Color.gray;
		}
		if (s.equals(GREEN)) {
			return Color.green;
		}
		if (s.equals(LIGHT_GRAY)) {
			return Color.lightGray;
		}
		if (s.equals(MAGENTA)) {
			return Color.magenta;
		}
		if (s.equals(ORANGE)) {
			return Color.orange;
		}
		if (s.equals(PINK)) {
			return Color.pink;
		}
		if (s.equals(RED)) {
			return bookRed;
		}
		if (s.equals(WHITE)) {
			return Color.white;
		}
		if (s.equals(YELLOW)) {
			return Color.yellow;
		}
		return Color.white;
	}
	/**
	 * Gets a String that defines the given Color. The color is either defined
	 * in this class of
	 *
	 * @param s defined color within the class or Color class.
	 *
	 * @return String that defines the given color or WHITE if no
	 * color is determined.
	 */
	public static String getString(Color s) {
        if (s.equals(bookRed))
            return BOOK_RED;
		if (s.equals(darkBlue)) {
			return DARK_BLUE;
		}
		if (s.equals(aqua)) {
			return AQUA;
		}
		if (s.equals(ghostlyGray)) {
			return GHOSTLY_GRAY;
		}
		if (s.equals(grayGreen)) {
			return GRAY_GREEN;
		}
		if (s.equals(grayRed)) {
			return GRAY_RED;
		}
		if (s.equals(grayBlue)) {
			return GRAY_BLUE;
		}
		if (s.equals(indigo)) {
			return INDIGO;
		}
		if (s.equals(yellowGreen)) {
			return YELLOW_GREEN;
		}
		if (s.equals(princetonOrange )) {
			return PRINCETON_ORANGE;
		}
		if (s.equals(lighterGray )) {
			return LIGHTER_GRAY;
		}
		if (s.equals(lightWhite )) {
			return LIGHT_WHITE;
		}
		if (s.equals(lightGreen )) {
			return LIGHT_GREEN;
		}
		if (s.equals(darkGreen )) {
			return DARK_GREEN;
		}
		if (s.equals(darkOrange)) {
			return DARK_ORANGE;
		}
		if (s.equals(Color.black )) {
			return BLACK;
		}
		if (s.equals(Color.blue )) {
			return BLUE;
		}
		if (s.equals(Color.cyan )) {
			return CYAN;
		}
		if (s.equals(Color.darkGray )) {
			return DARK_GRAY;
		}
		if (s.equals(Color.gray)) {
			return GRAY;
		}
		if (s.equals(Color.green )) {
			return GREEN;
		}
		if (s.equals(Color.lightGray )) {
			return LIGHT_GRAY;
		}
		if (s.equals(Color.magenta )) {
			return MAGENTA;
		}
		if (s.equals(Color.orange )) {
			return ORANGE;
		}
		if (s.equals(Color.pink)) {
			return PINK;
		}
		if (s.equals(Color.red )) {
			return RED;
		}
		if (s.equals(bookRed )) {
			return RED;
		}
		if (s.equals(Color.white )) {
			return WHITE;
		}
		if (s.equals( Color.yellow )) {
			return YELLOW;
		}
		return WHITE;
	}
	/**********************/
	/* Accessor Methods   */
	/**********************/
	/**
	 * Gets the paint.
	 *
	 * @return Paint of the settings.
	 */
	public Paint getPaint() {
		return paint;
	}
	/**
	 * Gets the string name for the current settings.
	 *
	 * @return String defining the settings name.
	 */
	 public String getSettingName() {
		 return settingName;
	 }
	/*******************/
	/* Mutator Methods */
	/*******************/
	/**
	 * Sets the paint.
	 *
	 * @param p Paint of the settings.
	 */
	public void setPaint(Paint p) {
		paint = p;
	}
	/**
	 * Sets the string name for the current settings.
	 *
	 * @param settingName String defining the settings name.
	 */
	 public void setSettingName(String settingName) {
		 this.settingName = settingName;
	 }
	/**
	 * Sets the scheme of the current PaintSettings using the defined String within this class. WHITE is default.
	 *
	 * @param s defined color string within the class to which the PaintSettings are set.
	 */
	public void setScheme(String s) {
		setSettingName(s);
        if (s.equals(BOOK_RED))
            setPaint(bookRed);
		if (s.equals(AQUA)) {
			setPaint(aqua);
		}
		else if (s.equals(GHOSTLY_GRAY)) {
			setPaint(ghostlyGray);
		}
		else if (s.equals(GRAY_GREEN)) {
			setPaint(grayGreen);
		}
		else if (s.equals(GRAY_RED)) {
			setPaint(grayRed);
		}
		else if (s.equals(GRAY_BLUE)) {
			setPaint(grayBlue);
		}
		else if (s.equals(INDIGO)) {
			setPaint(indigo);
		}
		else if (s.equals(YELLOW_GREEN)) {
			setPaint(yellowGreen);
		}
		else if (s.equals(DARK_BLUE)) {
			setPaint(darkBlue);
		}
		else if (s.equals(PRINCETON_ORANGE)) {
			setPaint(princetonOrange);
		}
		else if (s.equals(LIGHTER_GRAY)) {
			setPaint(lighterGray);
		}
		else if (s.equals(LIGHT_WHITE)) {
			setPaint(lightWhite);
		}
		else if (s.equals(LIGHT_GREEN)) {
			setPaint(lightGreen);
		}
		else if (s.equals(DARK_GREEN)) {
			setPaint(darkGreen);
		}
		else if (s.equals(DARK_ORANGE)) {
			setPaint(darkOrange);
		}
		else if (s.equals(BLACK)) {
			setPaint(Color.black);
		}
		else if (s.equals(BLUE)) {
			setPaint(Color.blue);
		}
		else if (s.equals(CYAN)) {
			setPaint(Color.cyan);
		}
		else if (s.equals(DARK_GRAY)) {
			setPaint(Color.darkGray);
		}
		else if (s.equals(GRAY)) {
			setPaint(Color.gray);
		}
		else if (s.equals(GREEN)) {
			setPaint(Color.green);
		}
		else if (s.equals(LIGHT_GRAY)) {
			setPaint(Color.lightGray);
		}
		else if (s.equals(MAGENTA)) {
			setPaint(Color.magenta);
		}
		else if (s.equals(ORANGE)) {
			setPaint(Color.orange);
		}
		else if (s.equals(PINK)) {
			setPaint(Color.pink);
		}
		else if (s.equals(RED)) {
			setPaint(bookRed);
		}
		else if (s.equals(WHITE)) {
			setPaint(Color.white);
		}
		else if (s.equals(YELLOW)) {
			setPaint(Color.yellow);
		}
		else {
			setPaint(Color.white);
		}
	}
	/**
	 * Implements cloneable so this method must be added so the object can be cloned.
	 *
	 * @return Object clone of the current PaintSettings.
	 */
    public Object clone() {
		try {
		    return super.clone();
		}
		catch (CloneNotSupportedException e) {
		    // this shouldn't happen, since we are Cloneable
		    throw new InternalError();
		}
    }
}