    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 * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数＋１に
    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 */
    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         * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数＋１に
    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の個数＋１が、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}