    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.util;
    017
    018import org.opengion.fukurou.system.OgRuntimeException ;                         // 6.4.2.0 (2016/01/29)
    019import java.awt.Color;
    020// import java.util.LinkedHashMap;                                                                      // 6.4.6.1 (2016/06/03)
    021import java.util.Map;
    022import java.util.HashMap;                                                                                       // 7.0.1.1 (2018/10/22)
    023// import java.util.List;                                                                                       // 6.9.9.2 (2018/09/18)
    024// import java.util.ArrayList;                                                                          // 6.9.9.2 (2018/09/18)
    025import java.util.Locale ;
    026
    027import static org.opengion.fukurou.system.HybsConst.CR;                         // 6.1.0.0 (2014/12/26) refactoring
    028
    029/**
    030 * ColorMap.java は、共通的に使用される Color関連メソッドを集約した、クラスです。
    031 * StringUtil から、Color関係の部分を独立させました。
    032 *
    033 * カラー文字列は、java.awt.Color static 定義色、CSS1 / HTML3–4 / VGA の色名称、
    034 * X11の色名称 が指定できます。
    035 *
    036 * カラー番号は、ビビッドを、0～11 (V0～V11) , パステルを、12～23 (P0～P11) として登録します。
    037 * 従来のカラー番号と異なりますので、ご注意ください。
    038 *
    039 * @og.group ユーティリティ
    040 * @og.rev 6.0.2.1 (2014/09/26) 新規作成
    041 * @og.rev 6.4.3.3 (2016/03/04) ViewForm_ImageTimeBar#FlgColorMap 内部クラスから機能移動
    042 * @og.rev 7.0.1.1 (2018/10/22) 内部色コードを文字列として管理、配列は、パステルとビビッドから作成します。
    043 * @og.rev 8.0.0.0 (2021/08/31) 内部カラーの優先順を、パステル、ビビッド に変更します。
    044 *
    045 * @version  6.0
    046 * @author       Kazuhiko Hasegawa
    047 * @since    JDK8.0,
    048 */
    049public final class ColorMap {
    050//      // 6.9.9.2 (2018/09/18) Map から、CLR_ARY を作成します。
    051//      // 6.4.3.3 (2016/03/04) ViewForm_ImageTimeBar#FlgColorMap 内部クラスから移動
    052//      private static final Color[] CLR_ARY = new Color[] {
    053//                      Color.BLUE      ,Color.CYAN   ,Color.GRAY ,Color.GREEN ,Color.LIGHT_GRAY ,Color.MAGENTA ,
    054//                      Color.DARK_GRAY ,Color.ORANGE ,Color.PINK ,Color.RED   ,Color.YELLOW
    055//      };
    056
    057        /** 色種別ｷｰﾜｰﾄﾞ   {@value}        */
    058        public static final String PASTEL = "PASTEL" ;          // 7.0.1.3 (2018/11/12)
    059        /** 色種別ｷｰﾜｰﾄﾞ   {@value}        */
    060        public static final String VIVID  = "VIVID"  ;          // 7.0.1.3 (2018/11/12)
    061
    062        // 6.9.9.2 (2018/09/18) パステルカラー の色ｺｰﾄﾞ配列追加
    063        private static final String[] PSTL_KEY = new String[] {
    064                "#7F7FFF" , "#7FFF7F" ,  "#FF7F7F" ,                    // 5,  9, 1
    065                "#7FFFFF" , "#FFFF7F" ,  "#FF7FFF" ,                    // 7, 11, 3
    066                "#7FFFBF" , "#FFBF7F" ,  "#BF7FFF" ,                    // 8, 12, 4
    067                "#7FBFFF" , "#BFFF7F" ,  "#FF7FBF"                      // 6, 10, 2
    068        };
    069
    070        // 7.0.1.1 (2018/10/22) ビビッドカラー の色ｺｰﾄﾞ配列追加
    071        private static final String[] VIVID_KEY = new String[] {
    072                "#0000FF" , "#00FF00" , "#FF0000" ,                     // 5,  9, 1
    073                "#00FFFF" , "#FFFF00" , "#FF00FF" ,                     // 7, 11, 3
    074                "#00FF7F" , "#FF7F00" , "#7F00FF" ,                             // 8, 12, 4
    075                "#007FFF" , "#7FFF00" , "#FF007F"                               // 6, 10, 2
    076        };
    077
    078        // 8.0.0.0 (2021/08/31) 内部カラーの優先順を、パステル、ビビッド に変更します。
    079//      private static final String[] COLOR_KEY = new String[VIVID_KEY.length + PSTL_KEY.length];
    080        private static final String[] COLOR_KEY = new String[PSTL_KEY.length + VIVID_KEY.length];
    081        static {
    082//              System.arraycopy( VIVID_KEY, 0, COLOR_KEY, 0                            , VIVID_KEY.length );
    083//              System.arraycopy( PSTL_KEY , 0, COLOR_KEY, VIVID_KEY.length     , PSTL_KEY.length );
    084                System.arraycopy( PSTL_KEY , 0, COLOR_KEY, 0                            , PSTL_KEY.length );
    085                System.arraycopy( VIVID_KEY, 0, COLOR_KEY, PSTL_KEY.length      , VIVID_KEY.length );
    086        }
    087
    088//
    089//      // 4.0.3.0 (2007/12/26) 色コードにPURPLE を追加
    090//      // 5.7.8.0 (2014/07/04) 透明追加
    091//      private static final List<Color>                CLR_LIST = new ArrayList<>();                   // 6.9.9.2 (2018/09/18) 色配列ではなく、リストに変更します。
    092        /** staticイニシャライザ。読み取り専用(Collections.unmodifiableMap(Map))や、ConcurrentHashMap を使用しません。 */
    093//      private static final Map<String,Color>  CLR_MAP  = new LinkedHashMap<>();               // 6.4.6.1 (2016/06/03) 登録順をキープします。
    094        private static final Map<String,String> CLR_MAP  = new HashMap<>();                     // 7.0.1.1 (2018/10/22) 文字列として管理します。
    095        static {
    096                // java.awt.Color static 定義色
    097                CLR_MAP.put( "BLUE"                     , "#0000FF" );          // Color.BLUE
    098                CLR_MAP.put( "CYAN"                     , "#00FFFF" );          // Color.CYAN
    099                CLR_MAP.put( "GRAY"                     , "#808080" );          // Color.GRAY
    100                CLR_MAP.put( "GREEN"            , "#008000" );          // Color.GREEN
    101                CLR_MAP.put( "LIGHTGRAY"        , "#D3D3D3" );          // Color.LIGHT_GRAY
    102                CLR_MAP.put( "MAGENTA"          , "#FF00FF" );          // Color.MAGENTA
    103                CLR_MAP.put( "DARKGRAY"         , "#A9A9A9" );          // Color.DARK_GRAY
    104                CLR_MAP.put( "ORANGE"           , "#FFA500" );          // Color.ORANGE
    105                CLR_MAP.put( "PINK"                     , "#FFC0CB" );          // Color.PINK
    106                CLR_MAP.put( "RED"                      , "#FF0000" );          // Color.RED
    107                CLR_MAP.put( "YELLOW"           , "#FFFF00" );          // Color.YELLOW
    108
    109//              // 6.9.9.2 (2018/09/18) CSS1 / HTML3–4 / VGA の色名称の後ろに移動。
    110//              CLR_MAP.put( "WHITE"            ,Color.WHITE            );
    111//              CLR_MAP.put( "BLACK"            ,Color.BLACK            );
    112//              CLR_MAP.put( "TRANSPARENT"      ,new Color( 255,255,255,0 )     );              // 5.7.8.0 (2014/07/04) 透明追加
    113
    114                // 6.0.2.1 (2014/09/26) CSS1 / HTML3–4 / VGA の色名称 追加
    115                CLR_MAP.put( "LIME"                     , "#00FF00" );
    116                CLR_MAP.put( "AQUA"                     , "#00FFFF" );
    117                CLR_MAP.put( "SILVER"           , "#C0C0C0" );
    118                CLR_MAP.put( "MAROON"           , "#800000" );          // X11では、#B03060
    119                CLR_MAP.put( "OLIVE"            , "#808000" );
    120                CLR_MAP.put( "TEAL"                     , "#008080" );
    121                CLR_MAP.put( "NAVY"                     , "#000080" );
    122                CLR_MAP.put( "FUCHSIA"          , "#FF00FF" );
    123                CLR_MAP.put( "PURPLE"           , "#800080" );          // X11では、#A020F0
    124
    125//              // 6.9.9.2 (2018/09/18) Map から、CLR_LIST を作成するのは、ここまで。
    126//              CLR_LIST.addAll( CLR_MAP.values() );
    127//
    128//              // 6.9.9.2 (2018/09/18) パステルカラー の色ｺｰﾄﾞ配列追加
    129//              for( final String col : PSTL_KEY ) {
    130//                      CLR_LIST.add( Color.decode( col ) );
    131//              }
    132
    133                CLR_MAP.put( "WHITE"            , "#FFFFFF" );          // WHITE
    134                CLR_MAP.put( "BLACK"            , "#000000" );          // BLACK
    135//              CLR_MAP.put( "TRANSPARENT"      , new Color( 255,255,255,0 )    );              // 5.7.8.0 (2014/07/04) 透明追加
    136                CLR_MAP.put( "TRANSPARENT"      , "rgba( 255,255,255,0 )"               );              // 7.0.1.2 (2018/11/04) 透明
    137
    138                // 6.0.2.1 (2014/09/26) X11の色名称 追加
    139                CLR_MAP.put( "ALICEBLUE"                        , "#F0F8FF" );
    140                CLR_MAP.put( "ANTIQUEWHITE"                     , "#FAEBD7" );
    141                CLR_MAP.put( "AQUAMARINE"                       , "#7FFFD4" );
    142                CLR_MAP.put( "AZURE"                            , "#F0FFFF" );
    143                CLR_MAP.put( "BEIGE"                            , "#F5F5DC" );
    144                CLR_MAP.put( "BISQUE"                           , "#FFE4C4" );
    145                CLR_MAP.put( "BLANCHEDALMOND"           , "#FFEBCD" );
    146                CLR_MAP.put( "BLUEVIOLET"                       , "#8A2BE2" );
    147                CLR_MAP.put( "BROWN"                            , "#A52A2A" );
    148                CLR_MAP.put( "BURLYWOOD"                        , "#DEB887" );
    149                CLR_MAP.put( "CADETBLUE"                        , "#5F9EA0" );
    150                CLR_MAP.put( "CHARTREUSE"                       , "#7FFF00" );
    151                CLR_MAP.put( "CHOCOLATE"                        , "#D2691E" );
    152                CLR_MAP.put( "CORAL"                            , "#FF7F50" );
    153                CLR_MAP.put( "CORNFLOWERBLUE"           , "#6495ED" );
    154                CLR_MAP.put( "CORNSILK"                         , "#FFF8DC" );
    155                CLR_MAP.put( "CRIMSON"                          , "#DC143C" );
    156                CLR_MAP.put( "DARKBLUE"                         , "#00008B" );
    157                CLR_MAP.put( "DARKCYAN"                         , "#008B8B" );
    158                CLR_MAP.put( "DARKGOLDENROD"            , "#B8860B" );
    159                CLR_MAP.put( "DARKGREEN"                        , "#006400" );
    160                CLR_MAP.put( "DARKKHAKI"                        , "#BDB76B" );
    161                CLR_MAP.put( "DARKMAGENTA"                      , "#8B008B" );
    162                CLR_MAP.put( "DARKOLIVEGREEN"           , "#556B2F" );
    163                CLR_MAP.put( "DARKORANGE"                       , "#FF8C00" );
    164                CLR_MAP.put( "DARKORCHID"                       , "#9932CC" );
    165                CLR_MAP.put( "DARKRED"                          , "#8B0000" );
    166                CLR_MAP.put( "DARKSALMON"                       , "#E9967A" );
    167                CLR_MAP.put( "DARKSEAGREEN"                     , "#8FBC8F" );
    168                CLR_MAP.put( "DARKSLATEBLUE"            , "#483D8B" );
    169                CLR_MAP.put( "DARKSLATEGRAY"            , "#2F4F4F" );
    170                CLR_MAP.put( "DARKTURQUOISE"            , "#00CED1" );
    171                CLR_MAP.put( "DARKVIOLET"                       , "#9400D3" );
    172                CLR_MAP.put( "DEEPPINK"                         , "#FF1493" );
    173                CLR_MAP.put( "DEEPSKYBLUE"                      , "#00BFFF" );
    174                CLR_MAP.put( "DIMGRAY"                          , "#696969" );
    175                CLR_MAP.put( "DODGERBLUE"                       , "#1E90FF" );
    176                CLR_MAP.put( "FIREBRICK"                        , "#B22222" );
    177                CLR_MAP.put( "FLORALWHITE"                      , "#FFFAF0" );
    178                CLR_MAP.put( "FORESTGREEN"                      , "#228B22" );
    179                CLR_MAP.put( "GAINSBORO"                        , "#DCDCDC" );
    180                CLR_MAP.put( "GHOSTWHITE"                       , "#F8F8FF" );
    181                CLR_MAP.put( "GOLD"                                     , "#FFD700" );
    182                CLR_MAP.put( "GOLDENROD"                        , "#DAA520" );
    183                CLR_MAP.put( "GREENYELLOW"                      , "#ADFF2F" );
    184                CLR_MAP.put( "HONEYDEW"                         , "#F0FFF0" );
    185                CLR_MAP.put( "HOTPINK"                          , "#FF69B4" );
    186                CLR_MAP.put( "INDIANRED"                        , "#CD5C5C" );
    187                CLR_MAP.put( "INDIGO"                           , "#4B0082" );
    188                CLR_MAP.put( "IVORY"                            , "#FFFFF0" );
    189                CLR_MAP.put( "KHAKI"                            , "#F0E68C" );
    190                CLR_MAP.put( "LAVENDER"                         , "#E6E6FA" );
    191                CLR_MAP.put( "LAVENDERBLUSH"            , "#FFF0F5" );
    192                CLR_MAP.put( "LAWNGREEN"                        , "#7CFC00" );
    193                CLR_MAP.put( "LEMONCHIFFON"                     , "#FFFACD" );
    194                CLR_MAP.put( "LIGHTBLUE"                        , "#ADD8E6" );
    195                CLR_MAP.put( "LIGHTCORAL"                       , "#F08080" );
    196                CLR_MAP.put( "LIGHTCYAN"                        , "#E0FFFF" );
    197                CLR_MAP.put( "LIGHTGOLDENRODYELLOW"     , "#FAFAD2" );
    198                CLR_MAP.put( "LIGHTGREEN"                       , "#90EE90" );
    199                CLR_MAP.put( "LIGHTPINK"                        , "#FFB6C1" );
    200                CLR_MAP.put( "LIGHTSALMON"                      , "#FFA07A" );
    201                CLR_MAP.put( "LIGHTSEAGREEN"            , "#20B2AA" );
    202                CLR_MAP.put( "LIGHTSKYBLUE"                     , "#87CEFA" );
    203                CLR_MAP.put( "LIGHTSLATEGRAY"           , "#778899" );
    204                CLR_MAP.put( "LIGHTSTEELBLUE"           , "#B0C4DE" );
    205                CLR_MAP.put( "LIGHTYELLOW"                      , "#FFFFE0" );
    206                CLR_MAP.put( "LIMEGREEN"                        , "#32CD32" );
    207                CLR_MAP.put( "LINEN"                            , "#FAF0E6" );
    208                CLR_MAP.put( "MEDIUMAQUAMARINE"         , "#66CDAA" );
    209                CLR_MAP.put( "MEDIUMBLUE"                       , "#0000CD" );
    210                CLR_MAP.put( "MEDIUMORCHID"                     , "#BA55D3" );
    211                CLR_MAP.put( "MEDIUMPURPLE"                     , "#9370DB" );
    212                CLR_MAP.put( "MEDIUMSEAGREEN"           , "#3CB371" );
    213                CLR_MAP.put( "MEDIUMSLATEBLUE"          , "#7B68EE" );
    214                CLR_MAP.put( "MEDIUMSPRINGGREEN"        , "#00FA9A" );
    215                CLR_MAP.put( "MEDIUMTURQUOISE"          , "#48D1CC" );
    216                CLR_MAP.put( "MEDIUMVIOLETRED"          , "#C71585" );
    217                CLR_MAP.put( "MIDNIGHTBLUE"                     , "#191970" );
    218                CLR_MAP.put( "MINTCREAM"                        , "#F5FFFA" );
    219                CLR_MAP.put( "MISTYROSE"                        , "#FFE4E1" );
    220                CLR_MAP.put( "MOCCASIN"                         , "#FFE4B5" );
    221                CLR_MAP.put( "NAVAJOWHITE"                      , "#FFDEAD" );
    222                CLR_MAP.put( "OLDLACE"                          , "#FDF5E6" );
    223                CLR_MAP.put( "OLIVEDRAB"                        , "#6B8E23" );
    224                CLR_MAP.put( "ORANGERED"                        , "#FF4500" );
    225                CLR_MAP.put( "ORCHID"                           , "#DA70D6" );
    226                CLR_MAP.put( "PALEGOLDENROD"            , "#EEE8AA" );
    227                CLR_MAP.put( "PALEGREEN"                        , "#98FB98" );
    228                CLR_MAP.put( "PALETURQUOISE"            , "#AFEEEE" );
    229                CLR_MAP.put( "PALEVIOLETRED"            , "#DB7093" );
    230                CLR_MAP.put( "PAPAYAWHIP"                       , "#FFEFD5" );
    231                CLR_MAP.put( "PEACHPUFF"                        , "#FFDAB9" );
    232                CLR_MAP.put( "PERU"                                     , "#CD853F" );
    233                CLR_MAP.put( "PLUM"                                     , "#DDA0DD" );
    234                CLR_MAP.put( "POWDERBLUE"                       , "#B0E0E6" );
    235                CLR_MAP.put( "ROSYBROWN"                        , "#BC8F8F" );
    236                CLR_MAP.put( "ROYALBLUE"                        , "#4169E1" );
    237                CLR_MAP.put( "SADDLEBROWN"                      , "#8B4513" );
    238                CLR_MAP.put( "SALMON"                           , "#FA8072" );
    239                CLR_MAP.put( "SANDYBROWN"                       , "#F4A460" );
    240                CLR_MAP.put( "SEAGREEN"                         , "#2E8B57" );
    241                CLR_MAP.put( "SEASHELL"                         , "#FFF5EE" );
    242                CLR_MAP.put( "SIENNA"                           , "#A0522D" );
    243                CLR_MAP.put( "SKYBLUE"                          , "#87CEEB" );
    244                CLR_MAP.put( "SLATEBLUE"                        , "#6A5ACD" );
    245                CLR_MAP.put( "SLATEGRAY"                        , "#708090" );
    246                CLR_MAP.put( "SNOW"                                     , "#FFFAFA" );
    247                CLR_MAP.put( "SPRINGGREEN"                      , "#00FF7F" );
    248                CLR_MAP.put( "STEELBLUE"                        , "#4682B4" );
    249                CLR_MAP.put( "TAN"                                      , "#D2B48C" );
    250                CLR_MAP.put( "THISTLE"                          , "#D8BFD8" );
    251                CLR_MAP.put( "TOMATO"                           , "#FF6347" );
    252                CLR_MAP.put( "TURQUOISE"                        , "#40E0D0" );
    253                CLR_MAP.put( "VIOLET"                           , "#EE82EE" );
    254                CLR_MAP.put( "WHEAT"                            , "#F5DEB3" );
    255                CLR_MAP.put( "WHITESMOKE"                       , "#F5F5F5" );
    256                CLR_MAP.put( "YELLOWGREEN"                      , "#9ACD32" );
    257
    258//              // 6.4.4.1 (2016/03/18) 数字に対応する
    259//              for( int i=0; i<CLR_ARY.length; i++ ) {
    260//                      CLR_MAP.put( String.valueOf( i ) ,CLR_ARY[i] );                 // 0:BLUE , 1:CYAN , 2:GRAY ･･･ を、Mapに登録しておきます。
    261//              }
    262
    263//              // 6.9.9.2 (2018/09/18) 数字に対応する(配列からリストに変更の対応)
    264//              for( int i=0; i<CLR_LIST.size(); i++ ) {
    265//                      CLR_MAP.put( String.valueOf( i ) ,CLR_LIST.get(i) );    // 0:BLUE , 1:CYAN , 2:GRAY ･･･ を、Mapに登録しておきます。
    266//              }
    267
    268                // 7.0.1.1 (2018/10/22) 色番号も、Mapに登録しておきます。
    269                // ビビッドを、0～11 (V0～V11) , パステルを、11～23 (P0～P11) とします。
    270                int cno = 0;
    271                for( int i=0; i<VIVID_KEY.length; i++ ) {
    272                        CLR_MAP.put( String.valueOf( cno++ ) , VIVID_KEY[i] );          // 0～11
    273                        CLR_MAP.put( "V" + i                             , VIVID_KEY[i] );              // V0～V11
    274                }
    275
    276                for( int i=0; i<PSTL_KEY.length; i++ ) {
    277                        CLR_MAP.put( String.valueOf( cno++ ) , PSTL_KEY[i] );           // 11～23
    278                        CLR_MAP.put( "P" + i                             , PSTL_KEY[i] );               // P0～P11
    279                }
    280
    281                // 7.0.1.3 (2018/11/12) VIVIDとPASTELというｷｰﾜｰﾄﾞに、V0とP0を割り当てておきます。
    282                CLR_MAP.put( VIVID  , VIVID_KEY[0] );           // V0
    283                CLR_MAP.put( PASTEL , PSTL_KEY[0] );            // P0
    284        }
    285
    286        /**
    287         *      デフォルトコンストラクターをprivateにして、
    288         *      オブジェクトの生成をさせないようにする。
    289         *
    290         */
    291        private ColorMap() {}
    292
    293        /**
    294         * カラーキーワードより、Colorオブジェクトを作成します。
    295         *
    296         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
    297         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
    298         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , PURPLE , TRANSPARENT(透明) が指定できます。
    299         *
    300         * 6.0.2.1 (2014/09/26) 以降では、CSS1/HTML3–4/VGA の色名称として、
    301         * LIME , AQUA , SILVER , MAROON , OLIVE , TEAL , NAVY , FUCHSIA を追加。
    302         * それと、X11の色名称 を追加しました。
    303         *
    304         * また、先頭に、# を付ける事で、#XXXXXX形式の16bitRGB表記 でも指定可能です。
    305         * static フィールド名のMapを管理していますが、存在しない場合は、エラーになります。
    306         *
    307         * 色番号は、ビビッドを、0～11 (V0～V11) , パステルを、11～23 (P0～P11) とします。
    308         *
    309         * @og.rev 3.8.9.1 (2007/06/29) 新規作成
    310         * @og.rev 4.1.1.0 (2008/02/04) CLR_MAP に存在しない場合はエラーにします。
    311         * @og.rev 6.0.2.1 (2014/09/26) CSS1/HTML3–4/VGA の色名称 , X11の色名称 追加
    312         * @og.rev 6.3.9.0 (2015/11/06) valueのnullチェックの仕方が間違っていた。
    313         * @og.rev 6.4.6.1 (2016/06/03) 色番号の取得も対応しておきます。
    314         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    315         * @og.rev 7.0.6.4 (2019/11/29) 数値指定の色がMapにないとｴﾗｰになっていた個所を修正
    316         *
    317         * @param       value java.awt.Color フィールドを示す文字列または、#XXXXXX形式の16bitRGB表記
    318         *
    319         * @return      Colorオブジェクト
    320         * @see         java.awt.Color#BLACK
    321         */
    322        public static Color getColorInstance( final String value ) {
    323                // 6.3.9.0 (2015/11/06) valueのnullチェックの仕方が間違っていた。
    324                if( value == null || value.length() == 0 ) {
    325                        final String errMsg = "色コードが指定されていません。" + CR                    // 6.4.6.1 (2016/06/03)
    326                                                + "ColorMap=" + CLR_MAP.keySet().toString();
    327                        throw new OgRuntimeException( errMsg );
    328                }
    329
    330                // 色コードの番号(#XXXXXX) Mapになければエラー
    331                final String colCode ;
    332                if( value.charAt(0) == '#' ) {
    333                        colCode = value;
    334                }
    335                else {
    336                        final String val = value.replaceAll( "_" , "" ).toUpperCase(Locale.JAPAN);
    337                        colCode = CLR_MAP.get( val );
    338
    339                        if( colCode == null ) {
    340                                // 7.0.6.4 (2019/11/29) 数値指定の色がMapにないとｴﾗｰになっていた個所を修正
    341                                try {
    342                                        return getColorInstance( Integer.parseInt( val ) );
    343                                }
    344                                catch( final NumberFormatException ex ) {                       // 数字ではない value をパースしているので、この、Exception は伝播不要。
    345                                        final String errMsg = "指定の色コードはカラーマップに存在しません。 Color=[" + value + "]" + CR
    346                                                                + "ColorMap=" + CLR_MAP.keySet().toString();
    347                                        throw new OgRuntimeException( errMsg,ex );
    348                                }
    349                        }
    350                }
    351
    352                try {
    353                        return Color.decode( colCode );
    354                }
    355                catch( final NumberFormatException ex ) {                       // 10進、8進、および16進の整数値に変換できない場合
    356                        final String errMsg = "指定の色コードのフォーマットが異なります(#XXXXXX形式の16bitRGB表記) Color=[" + value + "]" ;
    357                        throw new OgRuntimeException( errMsg,ex );
    358                }
    359
    360//              Color clr = null ;                      // 6.4.6.1 (2016/06/03) 色番号で、再設定しているため、final をはずす。
    361//
    362//              if( value.charAt(0) == '#' ) {
    363//                      try {
    364//                              clr = Color.decode( value );
    365//                      }
    366//                      catch( final NumberFormatException ex ) {                       // 10進、8進、および16進の整数値に変換できない場合
    367//                              final String errMsg = "指定の色コードのフォーマットが異なります Color=[" + value + "]" + CR
    368//                                                      + "ColorMap=" + CLR_MAP.keySet().toString();
    369//                              throw new OgRuntimeException( errMsg,ex );
    370//                      }
    371//              }
    372//              else {
    373//                      // "_"を削除するのは、LIGHT_GRAY などの表記を統一するため。
    374//                      final String val = value.replaceAll( "_" , "" ).toUpperCase(Locale.JAPAN);
    375//                      clr = CLR_MAP.get( val );
    376//                      if( clr == null ) {
    377//                              // 6.4.6.1 (2016/06/03) 色番号の取得も対応しておきます。
    378//                              // 0 ～ 10 は登録済みなので、それ以降の数字の繰り返しが出来ない
    379//                              try {
    380//                                      clr = getColorInstance( Integer.parseInt( value ) );
    381//                              }
    382//                              catch( final NumberFormatException ex ) {                       // 数字ではない value をパースしているので、この、Exception は伝播不要。
    383//                                      final String errMsg = "指定の色コードは使用できません Color=[" + value + "]" + CR
    384//                                                              + "ColorMap=" + CLR_MAP.keySet().toString();
    385//                                      throw new OgRuntimeException( errMsg,ex );
    386//                              }
    387//                      }
    388//              }
    389//              return clr;
    390        }
    391
    392        /**
    393         * 指定の番号に対応した、色オブジェクトを返します。
    394         *
    395         * カラー番号は、ビビッドを、0～11 , パステルを、12～23 として登録しています。
    396         * 従来のカラー番号と異なりますので、ご注意ください。
    397         *
    398         * 23を超えると、0 に戻ります。
    399         *
    400         * @og.rev 6.4.3.3 (2016/03/04) ViewForm_ImageTimeBar#uniqColor() メソッドから移動。
    401         * @og.rev 6.9.9.2 (2018/09/18) 配列からリストに変更の対応
    402         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    403         *
    404         * @param       no 内部で管理している色番号
    405         * @return      色オブジェクト
    406         */
    407        public static Color getColorInstance( final int no ) {
    408                try {
    409                        return Color.decode( COLOR_KEY[no % COLOR_KEY.length] );
    410                }
    411                catch( final NumberFormatException ex ) {
    412                        final String errMsg = "指定の色番号の内部フォーマットがエラーです。no=[" + no + "] , code=[" + COLOR_KEY[no % COLOR_KEY.length] + "]" ;
    413                        throw new OgRuntimeException( errMsg,ex );
    414                }
    415        }
    416
    417        /**
    418         * 内部で管理している ColorMap のキー配列を返します。
    419         *
    420         * ここで返すのは、ビビッドを、0～11 , パステルを、12～23 として登録しています。
    421         * この、#XXXXXX形式の16bitRGB表記 を返します。
    422         *
    423         * @og.rev 6.0.2.1 (2014/09/26) 新規追加
    424         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    425         *
    426         * @param       no 内部で管理している色番号
    427         * @return      キー配列
    428         * @og.rtnNotNull
    429         */
    430        public static String getColorKey( final int no ) {
    431                return COLOR_KEY[no % COLOR_KEY.length];
    432        }
    433
    434        /**
    435         * 内部で管理している ColorMap から、指定のキーに対する色コードを返します。
    436         *
    437         * 色名称でも返しますが、主に、色番号を想定しています。
    438         * 引数が、文字列なのは、ビビッドを、0～11 (V0～V11) , パステルを、12～23 (P0～P11)
    439         * として管理しているためです。
    440         *
    441         * 色コードは、、#XXXXXX形式の16bitRGB表記です。
    442         * 色マップに値が存在しない場合は、null を返します。
    443         *
    444         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    445         *
    446         * @param       sno 内部で管理している色番号
    447         * @return      色コード(対象の色がMapに存在しない場合は、nullを返します)
    448         */
    449        public static String getColorKey( final String sno ) {
    450//              return CLR_MAP.get( sno );
    451                return getColorKey( sno , null );
    452        }
    453
    454        /**
    455         * 内部で管理している ColorMap から、指定のキーに対する色コードを返します。
    456         *
    457         * 色名称でも返しますが、主に、色番号を想定しています。
    458         * 引数が、文字列なのは、ビビッドを、0～11 (V0～V11) , パステルを、12～23 (P0～P11)
    459         * として管理しているためです。
    460         *
    461         * 色コードは、、#XXXXXX形式の16bitRGB表記です。
    462         *
    463         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    464         *
    465         * @param       sno 内部で管理している色番号,色記号
    466         * @param       defCol 色マップに値が存在しない場合に返す色
    467         * @return      色コード
    468         */
    469        public static String getColorKey( final String sno , final String defCol ) {
    470                return CLR_MAP.getOrDefault( sno , defCol );
    471        }
    472
    473        /**
    474         * 内部で管理している ColorMap のキー配列を返します。
    475         *
    476         * ここで返すのは、ビビッドを、0～11 , パステルを、12～23 として登録しています。
    477         * この、#XXXXXX形式の16bitRGB表記 を返します。
    478         *
    479         * @og.rev 6.0.2.1 (2014/09/26) 新規追加
    480         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    481         *
    482         * @return      キー配列
    483         * @og.rtnNotNull
    484         */
    485        public static String[] getColorKeys() {
    486//              return CLR_MAP.keySet().toArray( new String[CLR_MAP.size()] );
    487                return COLOR_KEY.clone();
    488        }
    489
    490        /**
    491         * 引数に応じた内部で管理している ColorMap のキー配列を返します。
    492         *
    493         * colKey が null の場合は、#getColorKeys() と同じ、COLOR_KEYすべてを返します。
    494         * colKey が、VIVID の場合は、#getVividKeys() を返します。
    495         * colKey が、PASTEL の場合は、#getPastelKeys() を返します。
    496         * それ以外は、CSVで分解して、各値を、#getColorKey(String,String) で求めた色コードの
    497         * 配列を返します。
    498         *
    499         * @og.rev 7.0.1.3 (2018/11/12) 引数に応じたColorMap のキー配列を返す。
    500         *
    501         * @param       colKey 内部で管理している色コード(nullの場合は、COLOR_KEYすべて。)
    502         * @return      キー配列
    503         * @og.rtnNotNull
    504         */
    505        public static String[] getColorKeys( final String colKey ) {
    506                final String[] rtnCols ;
    507
    508                if( colKey == null || colKey.isEmpty() ) {     rtnCols = getColorKeys(); }
    509                else if( VIVID.equalsIgnoreCase(  colKey ) ) { rtnCols = getVividKeys(); }
    510                else if( PASTEL.equalsIgnoreCase( colKey ) ) { rtnCols = getPastelKeys(); }
    511                else {
    512                        rtnCols = StringUtil.csv2Array( colKey );
    513                        for( int i=0; i<rtnCols.length; i++ ) {
    514                                rtnCols[i] = getColorKey( rtnCols[i] , rtnCols[i] );
    515                        }
    516                }
    517
    518                return rtnCols ;
    519        }
    520
    521//      /**
    522//       * 指定の番号に対応した、ビビッドカラーの色オブジェクトを返します。
    523//       *
    524//       * #getColorInstance(int) とほぼ同じ機能で、返すのは、パステルカラーの色オブジェクトです。
    525//       * https://www.colordic.org/v/
    526//       *
    527//       * １２色のビビッドカラーを、指定の番号に応じて、返します。
    528//       * 隣接する色は、できるだけ離れるようにしています。
    529//       *
    530//       * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    531//       * @og.rev 7.0.1.3 (2018/11/12) 廃止
    532//       *
    533//       * @param       no 内部で管理している色番号
    534//       * @return      ビビッドカラーの色コード
    535//       */
    536//      public static String getVividKey( final int no ) {
    537//              return VIVID_KEY[no % VIVID_KEY.length];
    538//      }
    539
    540        /**
    541         * 内部で管理している ビビッドカラー のキー配列を返します。
    542         *
    543         * @og.rev 7.0.1.1 (2018/10/22) ビビッドとパステルの全24色を対象とします。
    544         *
    545         * @return      パステルカラーのキー配列
    546         */
    547        public static String[] getVividKeys() {
    548                return VIVID_KEY.clone();
    549        }
    550
    551//      /**
    552//       * 指定の番号に対応した、パステルカラーの色オブジェクトを返します。
    553//       *
    554//       * #getColorInstance(int) とほぼ同じ機能で、返すのは、パステルカラーの色オブジェクトです。
    555//       * https://www.colordic.org/p/
    556//       *
    557//       * １２色のパステルカラーを、指定の番号に応じて、返します。
    558//       * 隣接する色は、できるだけ離れるようにしています。
    559//       *
    560//       * @og.rev 6.9.9.2 (2018/09/18) パステルカラーの色オブジェクト
    561//       * @og.rev 7.0.1.3 (2018/11/12) 廃止
    562//       *
    563//       * @param       no 内部で管理している色番号
    564//       * @return      パステルカラーの色コード
    565//       */
    566//      public static String getPastelKey( final int no ) {
    567//              return PSTL_KEY[no % PSTL_KEY.length];
    568//      }
    569
    570        /**
    571         * 内部で管理している パステルカラー のキー配列を返します。
    572         *
    573         * @og.rev 6.9.9.2 (2018/09/18) パステルカラーの色オブジェクト
    574         *
    575         * @return      パステルカラーのキー配列
    576         */
    577        public static String[] getPastelKeys() {
    578                return PSTL_KEY.clone();
    579        }
    580}