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
019 import java.util.List;
020 import java.util.ArrayList;
021 import java.awt.Graphics2D;
022 import java.awt.geom.Rectangle2D;
023 import org.jfree.ui.RectangleEdge;
024 import org.jfree.text.TextBlock;
025 import org.jfree.chart.axis.AxisState;
026 import org.jfree.chart.axis.CategoryAxis;
027 import org.jfree.chart.axis.CategoryAnchor;
028
029 /**
030 * HybsCategoryAxis は、CategoryAxis クラスを継承した、横軸管?ラスです?
031 * 横軸ラベルの表示制御を?主に行って?す?
032 * 横軸表示には?つの制御機?がカスタマイズされて?す?
033 *
034 * ??_" ラベルのスキ??(非表示)
035 * ?.cutNo 属?による、ラベル?位置??キーブレイク
036 * ?.skip 属?による、ラベルをスキ??する間隔の??
037 *
038 * 上記??,2,?の?で優先的に処?れます?
039 *
040 * @version 0.9.0 2007/06/21
041 * @author Kazuhiko Hasegawa
042 * @since JDK1.1,
043 */
044 public class HybsCategoryAxis extends CategoryAxis {
045 private static final long serialVersionUID = 519020100801L;
046
047 private static final TextBlock NULL_LABEL = new TextBlock() ;
048
049 // 4.1.2.0 (2008/03/12) 新規追?
050 private enum LabelVisible { TRUE(true) , FALSE(false) , UNDER(true) ;
051 private final boolean flag ;
052 LabelVisible( boolean flag ) { this.flag = flag; }
053 public boolean booleanValue() { return flag; }
054 };
055
056 /** For serialization. */
057 private int skip = 1; // skip数
058 private int count = 0; // skip 時?現在位置のカウン?
059
060 private transient List<LabelVisible> labelBreak = null;
061 private int cutNo = -1; // 4.1.1.0 (2008/02/04) ラベルブレイクのsubstring 位置
062 private String breakKey = null; // 4.1.1.0 (2008/02/04) ラベルブレイクの前回キー
063 private boolean isItemLabelLastVisible = false; // 4.1.2.0 (2008/03/12)
064 private final int hsCode = Long.valueOf( System.nanoTime() ).hashCode() ; // 5.1.9.0 (2010/08/01) equals,hashCode
065
066 /**
067 * 引数を指定して作?する コンストラクター
068 *
069 * skip(ラベルの表示間隔) = 1 , cutNo(ラベルブレイクのsubstring 位置) = -1 で初期化します?
070 *
071 * @param label ラベル
072 */
073 public HybsCategoryAxis( final String label ) {
074 this( label,1,-1 );
075 }
076
077 /**
078 * 引数を指定して作?する コンストラクター
079 *
080 * @og.rev 4.1.1.0 (2008/02/04) cutNo 新規追?
081 *
082 * @param label ラベル
083 * @param skip ラベルの表示間隔
084 * @param cutNo ラベルブレイクのsubstring 位置
085 */
086 protected HybsCategoryAxis( final String label,final int skip,final int cutNo ) {
087 super( label );
088 this.skip = skip ;
089 this.cutNo = cutNo ;
090 }
091
092 /**
093 * itemLabelVisible 時に、最後?値のみ表示するかど?[true/false]を指定します?
094 *
095 * これは、itemLabelVisible 属?に?last" と?設定?を指定した?合??
096 * ??みラベル表示します?
097 * こ?メソ?では、true が指定された場合??last" 属?が有効になったと
098 * 判断します?
099 *
100 * @og.rev 4.1.2.0 (2008/03/12) 新規追?
101 *
102 * @param flag ??値のみ表示するかど?[true/false]
103 */
104 protected void setItemLabelLastVisible( final boolean flag ) {
105 isItemLabelLastVisible = flag;
106 }
107
108 /**
109 * 軸を引く場合?使用することができるチックの??ストを作?します?
110 *
111 * @og.rev 4.1.1.0 (2008/02/04) labelBreak 新規追?
112 *
113 * @param g2 Graphics2Dオブジェク?フォント測定に使用)
114 * @param state AxisStateオブジェク?
115 * @param dataArea インサイドエリアを示すRectangle2Dオブジェク?
116 * @param edge ロケーションを指定するRectangleEdgeオブジェク?
117 *
118 * @return チックのリス?
119 */
120 @Override
121 public List<?> refreshTicks( final Graphics2D g2,
122 final AxisState state,
123 final Rectangle2D dataArea,
124 final RectangleEdge edge) {
125 count = 0;
126 labelBreak = new ArrayList<LabelVisible>();
127
128 return super.refreshTicks( g2, state, dataArea, edge);
129 }
130
131 /**
132 * TextBlock オブジェクトを作?します?
133 *
134 * こ?メソ?では?つの拡張機?を実現して?す?
135 * ??_" ラベルのスキ??(非表示)
136 * ?.cutNo 属?による、ラベル?位置??キーブレイク
137 * ?.skip 属?による、ラベルをスキ??する間隔の??
138 * cutNo が指定された場合?、skip 処??行われません。また?
139 * そ?場合?ラベルは、cutNoで?された先???のみ表示されます?
140 * ??が?cutNoで?された数より小さ??合?、そのまま使用されます?
141 *
142 * @og.rev 4.1.1.0 (2008/02/04) cutNo,labelBreak 追?
143 * @og.rev 4.1.2.0 (2008/03/12) LabelVisible.UNDER 処?追?
144 * @og.rev 4.3.1.1 (2008/08/23) lbl の null参?はずしの対?
145 *
146 * @param category カ?リ?
147 * @param width ?
148 * @param edge 表示?を示すRectangleEdgeオブジェク?
149 * @param g2 Graphics2Dオブジェク?
150 *
151 * @return TextBlockオブジェク?
152 */
153 @SuppressWarnings("rawtypes")
154 protected TextBlock createLabel( final Comparable category, final float width,
155 final RectangleEdge edge, final Graphics2D g2) {
156 TextBlock label = null ;
157 String lbl = null;
158 // if( category != null && category instanceof String ) {
159 if( category instanceof String ) { // 4.3.1.1 (2008/08/23) instanceof チェ?は、nullチェ?不?
160 lbl = (String)category;
161 if( lbl.startsWith( "_" ) ) {
162 label = NULL_LABEL;
163 }
164 }
165
166 // if( lbl.startsWith( "_" ) ) {
167 // label = NULL_LABEL;
168 // }
169 // else if( cutNo > 0 && lbl != null ) {
170 if( cutNo > 0 && lbl != null ) {
171 if( lbl.length() >= cutNo ) {
172 lbl = lbl.substring( 0,cutNo );
173 }
174
175 if( ! lbl.equals( breakKey ) ) {
176 label = super.createLabel( lbl, width, edge, g2);
177 breakKey = lbl ;
178 }
179 }
180 else {
181 if( count % skip == 0 ) {
182 label = super.createLabel( category, width, edge, g2);
183 }
184 count++;
185 }
186
187 if( label == null ) {
188 label = NULL_LABEL;
189 labelBreak.add( LabelVisible.FALSE );
190 }
191 else if( label.equals( NULL_LABEL ) ) {
192 labelBreak.add( LabelVisible.UNDER );
193 }
194 else {
195 labelBreak.add( LabelVisible.TRUE );
196 }
197
198 return label;
199 }
200
201 /**
202 * ラベルブレイクするかど?を返します?
203 *
204 * skip また?、cutNo によるラベルの間引き処?、指定?CategoryAxis
205 * に対するカラ?号を指定する事で、判定?を返します?
206 * 処?、Label の作?済みかど?に依存する為、その判定を先に行います?
207 *
208 * @og.rev 4.1.1.0 (2008/02/04) 新規追?
209 *
210 * @param column カラ?号
211 *
212 * @return ラベルブレイクするかど?(true:する)
213 */
214 protected boolean isLabelBreak( final int column ) {
215 return labelBreak == null ||
216 labelBreak.size() <= column ||
217 labelBreak.get( column ).booleanValue() ;
218 }
219
220 /**
221 * ITEM ラベル(?ータの設定?の説明用の値)を表示するかど?を返します?
222 *
223 * ラベルの先?に、アン??スコアがつ?ラベルは、ラベルの表示と
224 * ItemLabel の表示を抑止します?(false)
225 * それ以外?ラベルは、表示する(true) を返します?
226 * 処?、Label の作?済みかど?に依存する為、その判定を先に行います?
227 *
228 * @og.rev 4.1.2.0 (2008/03/12) 新規追?
229 *
230 * @param column カラ?号
231 *
232 * @return ITEMラベルを表示するかど?(true:する)
233 */
234 protected boolean isViewItemLabel( final int column ) {
235 boolean flag = labelBreak == null ||
236 labelBreak.size() <= column ||
237 labelBreak.get( column ) != LabelVisible.UNDER ;
238
239 if( flag && isItemLabelLastVisible && labelBreak.size() -1 != column ) {
240 flag = false;
241 }
242
243 return flag;
244 }
245
246 /**
247 * ドメイン(横軸)のカ?リ単位?ライン(縦?の描画位置を返します?
248 *
249 * こ?位置は、labelBreak が存在しな?、また?、ブレークするとき?み
250 * 値を返します?これにより、ライン(縦?の位置を?グラフ?中??
251 * ずらす事が可能になります?
252 * また?labelBreak により、ラベルを描画しな??合?、線?位置を???に
253 * 設定する事で、画面から見えなくします?
254 *
255 * @param anchor CategoryAnchorオブジェク?
256 * @param category カ?リ番号
257 * @param categoryCount カ?リ数
258 * @param area ?を表すRectangle2Dオブジェク?
259 * @param edge ロケーションを指定するRectangleEdgeオブジェク?
260 *
261 * @return ライン(縦?の描画位置
262 */
263 @Override
264 public double getCategoryJava2DCoordinate( final CategoryAnchor anchor,
265 final int category,
266 final int categoryCount,
267 final Rectangle2D area,
268 final RectangleEdge edge) {
269
270 final double result ;
271
272 // labelBreak が存在しな?、また?、ブレークするとき?み値を返す?
273 if( isLabelBreak( category ) ) {
274 result = super.getCategoryJava2DCoordinate(
275 anchor,category,categoryCount,area,edge
276 ) ;
277 }
278 else {
279 result = 0;
280 }
281 return result ;
282 }
283
284 /**
285 * こ???と?されたオブジェクトを比?ます?
286 *
287 * 親クラスで、equals メソ?が実?れて?ため、警告がでます?
288 *
289 * @og.rev 5.1.8.0 (2010/07/01) findbug対?
290 * @og.rev 5.1.9.0 (2010/08/01) findbug対?
291 *
292 * @param object 比?るオブジェク?
293 *
294 * @return Objectが等し??合? true、そ?な??合? false
295 */
296 @Override
297 public boolean equals( final Object object ) {
298 // return super.equals( object );
299 if( super.equals( object ) ) {
300 return hsCode == ((HybsCategoryAxis)object).hsCode;
301 }
302 return false;
303 }
304
305 /**
306 * こ?オブジェクト?ハッシュコードを取得します?
307 *
308 * @og.rev 5.1.8.0 (2010/07/01) findbug対?
309 * @og.rev 5.1.9.0 (2010/08/01) findbug対?
310 *
311 * @return ハッシュコー?
312 */
313 // public int hashCode() { return super.hashCode() ; }
314 @Override
315 public int hashCode() { return hsCode ; }
316
317 /**
318 * Tests this axis for equality with an arbitrary object.
319 *
320 * @og.rev 4.1.0.1(2008/01/19) 新規追?
321 * @og.rev 5.1.8.0 (2010/07/01) ?
322 *
323 * @param obj the object (<code>null</code> permitted).
324 *
325 * @return A boolean.
326 */
327 // public boolean equals( final Object obj ) {
328 // if( obj == null ) {
329 // return false;
330 // }
331 // if( obj == this ) {
332 // return true;
333 // }
334 // if( !(obj instanceof HybsCategoryAxis) ) {
335 // return false;
336 // }
337 // if( !super.equals(obj) ) {
338 // return false;
339 // }
340 // HybsCategoryAxis that = (HybsCategoryAxis) obj;
341 // if( that.count != count || that.skip != skip || that.cutNo != cutNo ) {
342 // return false;
343 // }
344 //
345 // return true;
346 // }
347
348 /**
349 * Returns a hash code for this object.
350 *
351 * @og.rev 4.1.0.1(2008/01/19) 新規追?
352 * @og.rev 5.1.8.0 (2010/07/01) ?
353 *
354 * @return A hash code.
355 */
356 // public int hashCode() {
357 // return ( getLabel() + ":" + count + ":" + skip + ":" + cutNo ).hashCode();
358 // }
359 }