MSColor.java

package com.github.mygreen.cellformatter.lang;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 書式中の色を表現するクラス。
 * <p>色はパレットが指定可能。
 * <p>Excelの色パレット一覧:<a href="http://dmcritchie.mvps.org/excel/colors.htm" target="_blank">Color Palette and the 56 Excel ColorIndex Colors</a>
 * 
 * @author T.TSUCHIE
 *
 */
public class MSColor {
    
    private static final MessageResolver messageResolver = new MessageResolver("com.github.mygreen.cellformatter.color");
    
    /** 名前付きの色 - 黒 */
    public static final MSColor BLACK = new MSColor((short)1);
    
    /** 名前付きの色 - 白 */
    public static final MSColor WHITE = new MSColor((short)2);
    
    /** 名前付きの色 - 赤 */
    public static final MSColor RED = new MSColor((short)3);
    
    /** 名前付きの色 - 緑 */
    public static final MSColor GREEN = new MSColor((short)4);
    
    /** 名前付きの色 - 青 */
    public static final MSColor BLUE = new MSColor((short)5);
    
    /** 名前付きの色 - 黄 */
    public static final MSColor YELLOW = new MSColor((short)6);
    
    /** 名前付きの色 - 紫 */
    public static final MSColor MAGENTA = new MSColor((short)7);
    
    /** 名前付きの色 - 水 */
    public static final MSColor CYAN = new MSColor((short)8);
    
    /**
     * 名前付きの色のリスト
     */
    public static final List<MSColor> KNOWN_COLORS;
    static{
        KNOWN_COLORS = Collections.unmodifiableList(new CopyOnWriteArrayList<MSColor>(
                Arrays.asList(BLACK, WHITE, RED, GREEN, BLUE, YELLOW, MAGENTA, CYAN)));
    }
    
    /** 色のインデックス */
    private final short index;
    
    /** 色の名称 */
    private final String name;
    
    /**
     * インデックスを指定してインスタンスを作成する。
     * @param index 色のインデックス番号
     */
    public MSColor(final short index) {
        this.index = index;
        
        // 色名の取得
        this.name = messageResolver.getMessage(String.format("color.%d.name", index));
    }
    
    /**
     * 色のインデックス番号を取得する。
     * @return
     */
    public short getIndex() {
        return index;
    }
    
    /**
     * 色の名称の取得。
     * @return 名前がない場合は、nullを返す。
     */
    public String getName() {
        return name;
    }
    
    /**
     * ロケール固有の色の名称の取得。
     * <p>実行環境のロケールを元に取得する。
     * @return 別名がない場合は、nullを返す。
     */
    public String getLocaleName() {
        return messageResolver.getMessage(Locale.getDefault(), String.format("color.%d.name", index));
    }
    
    /**
     * ロケールを指定し固有の色の名称の取得する。
     * @param locale ロケール
     * @return 固有の名称がない場合は、nullを返す。
     */
    public String getLocaleName(final Locale locale) {
        return messageResolver.getMessage(locale, String.format("color.%d.name", index));
    }
    
    /**
     * HTMLの形式の色を取得する。
     * <p>例:{@code #000000}
     * @since 0.5
     * @return
     */
    public String getHtmlColor() {
        return messageResolver.getMessage(String.format("color.%d.html", index));
    }
    
    /**
     * RGB値を取得する。
     * @since 0.5
     * @return 配列の0番目から準備、Red、Green、Blubeの値。
     */
    public short[] getRgbColor() {
        String value = messageResolver.getMessage(String.format("color.%d.rgb", index));
        String[] split = value.split(",");
        
        short[] rgb = new short[3];
        rgb[0] = Short.valueOf(split[0]);
        rgb[1] = Short.valueOf(split[1]);
        rgb[2] = Short.valueOf(split[2]);
        
        return rgb;
        
    }
    
    /**
     * 既知の名前付きの色かどうか。
     * @param name
     * @return 不明な場合は、nullを返す。
     */
    public static MSColor valueOfKnownColor(final String name) {
        
        for(MSColor color : KNOWN_COLORS) {
            if(color.name.equalsIgnoreCase(name)) {
                return color;
                
            } else if(color.getLocaleName() != null && color.getLocaleName().equalsIgnoreCase(name)) {
                return color;
                
            }
            
        }
        
        return null;
        
    }
    
    /**
     * インデックス番号を指定して色を作成する。
     * <p>名前付きの既知の色の場合は、そのインスタンスを返す。
     * @param index
     * @return
     */
    public static MSColor valueOfIndexColor(final short index) {
        for(MSColor color : KNOWN_COLORS) {
            if(color.index == index){
                return color;
            }
            
        }
        
        return new MSColor(index);
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + index;
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(this == obj) {
            return true;
        }
        if(obj == null) {
            return false;
        }
        if(!(obj instanceof MSColor)) {
            return false;
        }
        MSColor other = (MSColor) obj;
        if(index != other.index) {
            return false;
        }
        return true;
    }
    
    
}