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.hayabusa.io;
017
018import java.awt.Color;
019
020/**
021 * ValueMarkOverColors は、ChartDataset で設定される ValueMark用の色管理クラスです。
022 * JFreeChart の個別属性を管理しているデータ管理クラスです。
023 * このクラスは、JFreeChart に特化した、値の判定ロジックのみを提供していますので、
024 * パッケージスコープでの提供になります。
025 *
026 * マーカーラインの値と、超過時のShape色を配列で指定します。
027 *
028 * マーカーラインを使用する場合に、そのラインを超えない色、超える色を指定します。
029 * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数+1に
030 * なります。つまり、色1:設定値1:色2:設定値2:色3 となります。
031 * 色1は、設定値1より小さい場合に使用され、色2は、設定値1より大きく、
032 * 設定値2より小さい場合、色3は、設定値2より大きい場合になります。
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 */
047class 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         * なります。つまり、色1:設定値1:色2:設定値2:色3 となります。
061         * 色1は、設定値1より小さい場合に使用され、色2は、設定値1より大きく、
062         * 設定値2より小さい場合、色3は、設定値2より大きい場合になります。
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}