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}