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    }