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 */
016 package org.opengion.hayabusa.io;
017
018 import java.awt.GradientPaint;
019 import java.awt.Graphics2D;
020 import java.awt.Paint;
021 import java.awt.Stroke;
022 import java.awt.geom.Rectangle2D;
023
024 import org.jfree.chart.renderer.category.BarRenderer;
025 import org.jfree.chart.renderer.category.CategoryItemRendererState;
026 import org.jfree.chart.axis.CategoryAxis;
027 import org.jfree.chart.axis.ValueAxis;
028 import org.jfree.chart.labels.CategoryItemLabelGenerator;
029 import org.jfree.chart.plot.CategoryPlot;
030 import org.jfree.chart.plot.PlotOrientation;
031 import org.jfree.chart.entity.EntityCollection;
032 import org.jfree.data.category.CategoryDataset;
033 import org.jfree.ui.GradientPaintTransformer;
034 import org.jfree.ui.RectangleEdge;
035
036 /**
037 * HybsBarRenderer は、org.jfree.chart.renderer.category.BarRenderer ?
038 * 拡張したカスタマイズクラスです?
039 * これは、描画に対して、予め制限を設けて、???度の向上を図って?す?
040 *
041 * @og.rev 4.1.1.0 (2008/02/04) 新規作?
042 *
043 * @version 0.9.0 2001/05/05
044 * @author Kazuhiko Hasegawa
045 * @since JDK1.1,
046 */
047 public class HybsBarRenderer extends BarRenderer implements HybsDrawItem {
048 private static final long serialVersionUID = 519020100801L ;
049
050 private boolean isItemLabelLastVisible = false; // 4.1.2.0 (2008/03/12)
051 private final int hsCode = Long.valueOf( System.nanoTime() ).hashCode() ; // 5.1.9.0 (2010/08/01) equals,hashCode
052
053 // 4.3.4.4 (2009/01/01)
054 // /**
055 // * Creates a new bar renderer with default settings.
056 // */
057 // public HybsBarRenderer() {
058 // super();
059 // }
060
061 /**
062 * itemLabelVisible 時に、最後?値のみ表示するかど?[true:有効/false:無効]を指定します?
063 *
064 * これは、itemLabelVisible 属?に?last" と?設定?を指定した?合??
065 * ??みラベル表示します?
066 * こ?メソ?では、true が指定された場合??last" 属?が有効になったと
067 * 判断します?
068 *
069 * @og.rev 4.1.2.0 (2008/03/12) 新規追?
070 *
071 * @param flag ??値のみ表示するかど?[true:有効/false:無効]
072 */
073 public void setItemLabelLastVisible( final boolean flag ) {
074 isItemLabelLastVisible = flag;
075 }
076
077 /**
078 * drawItem と同等?機?を持った?高?版メソ?です?
079 *
080 * @og.rev 4.1.1.0 (2008/02/04) 新規追?
081 * @og.rev 4.1.2.0 (2008/03/12) ラベルのアン??ライン時にItemLavelを表示しな?
082 *
083 * @param g2 Graphics2Dオブジェク?
084 * @param state CategoryItemRendererStateオブジェク?
085 * @param dataArea Rectangle2Dオブジェク?
086 * @param plot CategoryPlotオブジェク?
087 * @param domainAxis CategoryAxisオブジェク?
088 * @param rangeAxis ValueAxisオブジェク?
089 * @param dataset CategoryDatasetオブジェク?
090 * @param serNo シリアル番号
091 */
092 public void drawItem2( final Graphics2D g2, final CategoryItemRendererState state,
093 final Rectangle2D dataArea, final CategoryPlot plot, final CategoryAxis domainAxis,
094 final ValueAxis rangeAxis, final CategoryDataset dataset, final int serNo ) {
095
096 int clmCount = dataset.getColumnCount();
097 int rowCount = dataset.getRowCount();
098 RectangleEdge edge = plot.getRangeAxisEdge();
099
100 PlotOrientation orientation = plot.getOrientation();
101 double minBarLen = getMinimumBarLength();
102 double barWidth = state.getBarWidth();
103 boolean isDrawOutline = isDrawBarOutline() &&
104 state.getBarWidth() > BAR_OUTLINE_WIDTH_THRESHOLD ;
105
106 // 4.1.2.0 (2008/03/12)
107 HybsCategoryAxis hybsAxis = null;
108 if( domainAxis instanceof HybsCategoryAxis ) {
109 hybsAxis = (HybsCategoryAxis)domainAxis;
110 hybsAxis.setItemLabelLastVisible( isItemLabelLastVisible );
111 }
112
113 for( int row=0; row<rowCount; row++ ) {
114 boolean isItemLabelsVisible = isSeriesItemLabelsVisible( row );
115
116 for( int column=0; column<clmCount; column++ ) {
117 Number v1Num = dataset.getValue( row,column );
118 if(v1Num == null) { continue; }
119 double value = v1Num.doubleValue();
120
121 // 書き?し開始位置をずらす?
122 double barW0 = calculateBarW0( plot,orientation,dataArea,domainAxis,state,row,column );
123 double[] barL0L1 = calculateBarL0L1( value );
124 if (barL0L1 == null) { continue; }
125
126 double transL0 = rangeAxis.valueToJava2D( barL0L1[0],dataArea,edge );
127 double transL1 = rangeAxis.valueToJava2D( barL0L1[1],dataArea,edge );
128 double barL0 = Math.min( transL0,transL1 );
129 double barLength = Math.max( Math.abs( transL1 - transL0 ),minBarLen );
130
131 // Bar の描画
132 Rectangle2D bar = null;
133 if( orientation == PlotOrientation.HORIZONTAL ) {
134 bar = new Rectangle2D.Double( barL0,barW0,barLength,barWidth );
135 }
136 else {
137 bar = new Rectangle2D.Double( barW0,barL0,barWidth,barLength );
138 }
139
140 Paint itemPaint = getItemPaint( row,column );
141 // 4.3.1.1 (2008/08/23) 変数名を t ?gpt に変更
142 GradientPaintTransformer gpt = getGradientPaintTransformer();
143 if( gpt != null && itemPaint instanceof GradientPaint ) {
144 itemPaint = gpt.transform( (GradientPaint) itemPaint,bar );
145 }
146 g2.setPaint( itemPaint );
147 g2.fill( bar );
148
149 // outline の描画
150 if( isDrawOutline ) {
151 Stroke stroke = getItemOutlineStroke( row,column );
152 Paint paint = getItemOutlinePaint( row,column );
153 if( stroke != null && paint != null ) {
154 g2.setStroke( stroke );
155 g2.setPaint( paint );
156 g2.draw( bar );
157 }
158 }
159
160 // ItemLabel の描画
161 CategoryItemLabelGenerator generator = getItemLabelGenerator( row,column );
162 if( generator != null && isItemLabelsVisible ) {
163 // 4.1.2.0 (2008/03/12) アン??スコアの場合?、表示しな??
164 if( hybsAxis != null && hybsAxis.isViewItemLabel( column ) ) {
165 drawItemLabel( g2,dataset,row,column,plot,generator,bar,(value < 0.0) );
166 }
167 }
168 // 4.3.1.0 (2008/08/09) item entity の追?
169 EntityCollection entities = state.getEntityCollection();
170 if( entities != null ) {
171 addItemEntity( entities, dataset, row, column, bar );
172 }
173 }
174 }
175 }
176
177 /**
178 * こ???と?されたオブジェクトを比?ます?
179 *
180 * 親クラスで、equals メソ?が実?れて?ため、警告がでます?
181 *
182 * @og.rev 5.1.8.0 (2010/07/01) findbug対?
183 * @og.rev 5.1.9.0 (2010/08/01) findbug対?
184 *
185 * @param object 比?るオブジェク?
186 *
187 * @return Objectが等し??合? true、そ?な??合? false
188 */
189 @Override
190 public boolean equals( final Object object ) {
191 // return super.equals( object );
192 if( super.equals( object ) ) {
193 return hsCode == ((HybsBarRenderer)object).hsCode;
194 }
195 return false;
196 }
197
198 /**
199 * こ?オブジェクト?ハッシュコードを取得します?
200 *
201 * @og.rev 5.1.8.0 (2010/07/01) findbug対?
202 * @og.rev 5.1.9.0 (2010/08/01) findbug対?
203 *
204 * @return ハッシュコー?
205 */
206 // public int hashCode() { return super.hashCode() ; }
207 @Override
208 public int hashCode() { return hsCode ; }
209
210 /**
211 * こ?オブジェクトと?されたオブジェクトを比?ます?
212 *
213 * @og.rev 4.3.1.1 (2008/08/23) 新規追?
214 * @og.rev 5.1.8.0 (2010/07/01) ?
215 *
216 * @param anObject Object 比?れるオブジェク?
217 *
218 * @return ?されたオブジェクトが等し??合? true、そ?な??合? false
219 */
220 // public boolean equals( final Object anObject ) {
221 // if( super.equals( anObject ) ) {
222 // HybsBarRenderer other = ((HybsBarRenderer)anObject);
223 // return ( isItemLabelLastVisible == other.isItemLabelLastVisible );
224 // }
225 // return false;
226 // }
227
228 /**
229 * こ?オブジェクト?ハッシュコードを返します?
230 *
231 * @og.rev 4.3.1.1 (2008/08/23) 新規追?
232 * @og.rev 5.1.8.0 (2010/07/01) ?
233 *
234 * @return こ?オブジェクト?ハッシュコード?
235 */
236 // public int hashCode() {
237 // return super.hashCode() + ( (isItemLabelLastVisible) ? 1 : 0 );
238 // }
239 }