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     */
016    package org.opengion.hayabusa.io;
017    
018    import java.awt.Color;
019    
020    /**
021     * ValueMarkOverColors は、ChartDataset で設定される ValueMark用の色管ç�?‚¯ラスですã?
022     * JFreeChart の個別属æ?を管ç�?�—てã�?‚‹ãƒ??タ管ç�?‚¯ラスですã?
023     * こã?クラスは、JFreeChart に特化したã?値の判定ロジãƒ?‚¯のみを提供してã�?�¾すã?でã€?
024     * パッケージスコープでの提供になりますã?
025     *
026     * マã?カーラインの値と、è¶?�Ž時ã?Shape色をé?列でæŒ?®šしますã?
027     *
028     * マã?カーラインを使用する場合に、そのラインをè¶?�ˆなã�?‰²、è¶?�ˆる色を指定しますã?
029     * こã?色のæŒ?®šã?、ã?ーカーラインの色ã‚??ーカーラインの設定å?の個数?‹1に
030     * なりますã?つまりã?色?‘:設定å??‘:色?’:設定å??’:色??となりますã?
031     * 色?‘ã?、設定å??‘より小さã�??合に使用され、色?’ã?、設定å??‘より大きくã€?
032     * 設定å??’より小さã�??合ã?色?“ã?、設定å??’より大きい場合になりますã?
033     *
034     * Shape色は、java.awt.Color クラスのオブジェクトでæŒ?®šしますã?
035     * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
036     * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できますã?
037     * またã?#XXXXXX形式ã?16bitRGB表è¨?でも指定可能ですã?
038     * values と、あわせて設定するå¿?¦�がありますã?
039     * どちらかがã?æŒ?®šされてã�?�ªã�??合ã?、エラーになりますã?
040     *
041     * @og.rev 4.1.0.1(2008/01/19) ChartDataset クラスから独ç«?
042     *
043     * @version  0.9.0      2007/06/21
044     * @author       Kazuhiko Hasegawa
045     * @since        JDK1.1,
046     */
047    class ValueMarkOverColors {
048            private final double[]  markValues      ;               // doubleの配å?
049            private final Color[]   markOverColors;         // マã?カーラインのè¶?�Ž色
050            private final Color             markColor;                      // 動的マã?カーライン色
051            private final int               dynamicOCadrs;          // 動的マã?カーライン色
052    
053            /**
054             * コンストラクター
055             *
056             * マã?カーラインの値と、è¶?�Ž時ã?Shape色をé?列でæŒ?®šしますã?
057             *
058             * マã?カーラインを使用する場合に、そのラインをè¶?�ˆなã�?‰²、è¶?�ˆる色を指定しますã?
059             * こã?色のæŒ?®šã?、ã?ーカーラインの色ã‚??ーカーラインの設定å?の個数?‹1に
060             * なりますã?つまりã?色?‘:設定å??‘:色?’:設定å??’:色??となりますã?
061             * 色?‘ã?、設定å??‘より小さã�??合に使用され、色?’ã?、設定å??‘より大きくã€?
062             * 設定å??’より小さã�??合ã?色?“ã?、設定å??’より大きい場合になりますã?
063             *
064             * Shape色は、java.awt.Color クラスのオブジェクトでæŒ?®šしますã?
065             * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
066             * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できますã?
067             * またã?#XXXXXX形式ã?16bitRGB表è¨?でも指定可能ですã?
068             * values と、あわせて設定するå¿?¦�がありますã?
069             * どちらかがã?æŒ?®šされてã�?�ªã�??合ã?、エラーになりますã?
070             *
071             * @og.rev 4.1.0.1(2008/01/19) 新規追åŠ?
072             *
073             * @param   values double[] マã?カーラインの値配å?
074             * @param   overColors Color[] マã?カーラインのè¶?�Ž時ã?Shape色配å?
075             * @param   dynMarkColor Color 動的なマã?カーラインを使用時ã?動的ライン色
076             * @param       dynOCadrs       動的なマã?カーラインの基準番号
077             */
078            public ValueMarkOverColors( final double[]      values ,
079                                                                    final Color[]   overColors ,
080                                                                    final Color             dynMarkColor ,
081                                                                    final int               dynOCadrs ) {
082                    markValues              = values;
083                    markOverColors  = overColors;
084                    markColor               = dynMarkColor;
085                    dynamicOCadrs   = dynOCadrs;
086    
087                    if( markValues == null || markOverColors == null ||
088                            markValues.length + 1 != overColors.length ||
089                            markValues.length < 1 ) {
090    
091                            String errMsg = "ValueMarkOverColors が構築できませんã€?n"
092                                                    + " markValues ã�?null かã?markOverColors ã�?null かã?"
093                                                    + " markValuesの個数?‹1が、overColorsの個数に合è?しませんã€? ;
094                            System.out.println( errMsg );
095                            throw new RuntimeException( errMsg );
096                    }
097            }
098    
099            /**
100             * 動的マã?カーラインのライン色を返しますã?
101             *
102             * 動的マã?カーラインのライン色は、ChartDataset クラスの markValues
103             * 属æ?でã€?G"  とã�?�†æ–?­—å?を設定されたアドレスがã?使用されますã?
104             *
105             * @og.rev 4.1.0.1(2008/01/19) 新規追åŠ?
106             *
107             * @return      Color 動的マã?カーラインのライン色
108             */
109            protected Color getDynamicColor() {
110                    return markColor;
111            }
112    
113            /**
114             * コンストラクタでæŒ?®šされた設定å?配å?と比べて、合致するShape色を返しますã?
115             * 動的なオーバã?カラー(useDynamicOverColor)を使用しなã�??合ã?メソãƒ?ƒ‰ですã?
116             *
117             * @og.rev 4.1.0.1(2008/01/19) 新規追åŠ?
118             *
119             * @param       value     double マã?カーラインと比è¼?�™るå?
120             *
121             * @return      Color æŒ?®šã?値に対する Shape色
122             */
123            protected Color getColor( final double value ) {
124                    return getColor( value,markValues[0] );
125            }
126    
127            /**
128             * コンストラクタでæŒ?®šされた設定å?配å?と比べて、合致するShape色を返しますã?
129             * 動的なオーバã?カラー(useDynamicOverColor)を使用する場合ã?メソãƒ?ƒ‰ですã?
130             * ここでは、動çš?–¾値の比è¼?¯¾照をã?引数でæŒ?®šしますã?
131             *
132             * @og.rev 4.1.1.0 (2008/02/04) 新規追åŠ?
133             *
134             * @param       value  double マã?カーラインと比è¼?�™るå?
135             * @param       minNum Number æœ?¸‹位ã?動的マã?カーライン値
136             *
137             * @return      Color æŒ?®šã?値に対する Shape色
138             */
139            protected Color getColor( final double value, final Number minNum ) {
140                    Color rtnclr = null;
141    
142                    double minVal = 0.0 ;
143                    if( minNum != null ) {
144                            minVal = minNum.doubleValue();
145                    }
146                    rtnclr = getColor( value,minVal );
147    
148                    return rtnclr;
149            }
150    
151            /**
152             * コンストラクタでæŒ?®šされた設定å?配å?と比べて、合致するShape色を返しますã?
153             * 動的なオーバã?カラー(useDynamicOverColor)を使用する場合ã?メソãƒ?ƒ‰ですã?
154             * ここでは、動çš?–¾値の比è¼?¯¾照をã?引数でæŒ?®šしますã?
155             *
156             * å†?ƒ¨ロジãƒ?‚¯説明ï¼?
157             *  ・閾値[0]の値と比è¼?�—て、下ã?場合ã?、色[0]を返すã€?確å®?
158             *  ・閾値[N-1]の値と比è¼?�—て、上ã?場合ã?、色[N]を返すã€?確å®?
159             *  ・閾値[N-2]の値と比è¼?�—て、上ã?場合ã?、色[N-1]を返すã€?確å®?
160             *  ・閾値[1]の値と比è¼?�—て、上ã?場合ã?、色[2]を返すã€?確å®?
161             *  ・閾値[0]の値と比è¼?�—て、上ã?場合ã?、色[1]を返すã€?確å®?
162             * 閾値のアドレスがã?動的オーバã?カラー(dynamicOCadrs)の場合ã?ã€?
163             * 引数の markValue がã?動的閾値としてã€?–¾値配å?の代わりに使用されますã?
164             *
165             * @og.rev 4.1.1.0 (2008/02/04) 新規追åŠ?
166             * @og.rev 4.1.1.0 (2008/02/21) dynamicOCadrs をè?慮した処ç�?‚’行う
167             *
168             * @param       value     double マã?カーラインと比è¼?�™るå?
169             * @param       markValue double マã?カーライン値
170             *
171             * @return      Color æŒ?®šã?値に対する Shape色
172             */
173            private Color getColor( final double value,final double markValue ) {
174                    Color rtnclr = null;
175    
176                    if( dynamicOCadrs >= 0 ) {
177                            markValues[dynamicOCadrs] = markValue ;
178                    }
179    
180                    // 閾値[0]の値と比è¼?�—て、下ã?場合ã?、色[0]を返す
181                    if( value < markValues[0] ) {
182                            rtnclr = markOverColors[0];
183                    }
184                    else {
185                            // 閾値[N-1]の値と比è¼?�—て、上ã?場合ã?、色[N]を返すã€?確å®?
186                            for( int i=markValues.length-1; i>=0; i-- ) {
187                                    if( value >= markValues[i] ) {
188                                            rtnclr = markOverColors[i+1];
189                                            break;
190                                    }
191                            }
192                    }
193                    return rtnclr;
194            }
195    }