    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 * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数＋１に
    031 * なります。つまり、色１：設定値１：色２：設定値２：色３ となります。
    032 * 色１は、設定値１より小さい場合に使用され、色２は、設定値１より大きく、
    033 * 設定値２より小さい場合、色３は、設定値２より大きい場合になります。
    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         * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数＋１に
    061         * なります。つまり、色１：設定値１：色２：設定値２：色３ となります。
    062         * 色１は、設定値１より小さい場合に使用され、色２は、設定値１より大きく、
    063         * 設定値２より小さい場合、色３は、設定値２より大きい場合になります。
    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の個数＋１が、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}