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