1:
60:
61: package ;
62:
63: import ;
64: import ;
65: import ;
66: import ;
67: import ;
68:
69: import ;
70: import ;
71: import ;
72: import ;
73: import ;
74: import ;
75: import ;
76: import ;
77: import ;
78: import ;
79: import ;
80: import ;
81:
82:
88: public class IntervalBarRenderer extends BarRenderer
89: implements CategoryItemRenderer,
90: Cloneable,
91: PublicCloneable,
92: Serializable {
93:
94:
95: private static final long serialVersionUID = -5068857361615528725L;
96:
97:
100: public IntervalBarRenderer() {
101: super();
102: }
103:
104:
118: public void drawItem(Graphics2D g2,
119: CategoryItemRendererState state,
120: Rectangle2D dataArea,
121: CategoryPlot plot,
122: CategoryAxis domainAxis,
123: ValueAxis rangeAxis,
124: CategoryDataset dataset,
125: int row,
126: int column,
127: int pass) {
128:
129: if (dataset instanceof IntervalCategoryDataset) {
130: IntervalCategoryDataset d = (IntervalCategoryDataset) dataset;
131: drawInterval(g2, state, dataArea, plot, domainAxis, rangeAxis,
132: d, row, column);
133: }
134: else {
135: super.drawItem(g2, state, dataArea, plot, domainAxis, rangeAxis,
136: dataset, row, column, pass);
137: }
138:
139: }
140:
141:
154: protected void drawInterval(Graphics2D g2,
155: CategoryItemRendererState state,
156: Rectangle2D dataArea,
157: CategoryPlot plot,
158: CategoryAxis domainAxis,
159: ValueAxis rangeAxis,
160: IntervalCategoryDataset dataset,
161: int row,
162: int column) {
163:
164: int seriesCount = getRowCount();
165: int categoryCount = getColumnCount();
166:
167: PlotOrientation orientation = plot.getOrientation();
168:
169: double rectX = 0.0;
170: double rectY = 0.0;
171:
172: RectangleEdge domainAxisLocation = plot.getDomainAxisEdge();
173: RectangleEdge rangeAxisLocation = plot.getRangeAxisEdge();
174:
175:
176: Number value0 = dataset.getEndValue(row, column);
177: if (value0 == null) {
178: return;
179: }
180: double java2dValue0 = rangeAxis.valueToJava2D(
181: value0.doubleValue(), dataArea, rangeAxisLocation
182: );
183:
184:
185: Number value1 = dataset.getStartValue(row, column);
186: if (value1 == null) {
187: return;
188: }
189: double java2dValue1 = rangeAxis.valueToJava2D(
190: value1.doubleValue(), dataArea, rangeAxisLocation);
191:
192: if (java2dValue1 < java2dValue0) {
193: double temp = java2dValue1;
194: java2dValue1 = java2dValue0;
195: java2dValue0 = temp;
196: Number tempNum = value1;
197: value1 = value0;
198: value0 = tempNum;
199: }
200:
201:
202: double rectWidth = state.getBarWidth();
203:
204:
205: double rectHeight = Math.abs(java2dValue1 - java2dValue0);
206:
207: if (orientation == PlotOrientation.HORIZONTAL) {
208:
209: rectY = domainAxis.getCategoryStart(
210: column, getColumnCount(), dataArea, domainAxisLocation
211: );
212: if (seriesCount > 1) {
213: double seriesGap = dataArea.getHeight() * getItemMargin()
214: / (categoryCount * (seriesCount - 1));
215: rectY = rectY + row * (state.getBarWidth() + seriesGap);
216: }
217: else {
218: rectY = rectY + row * state.getBarWidth();
219: }
220:
221: rectX = java2dValue0;
222:
223: rectHeight = state.getBarWidth();
224: rectWidth = Math.abs(java2dValue1 - java2dValue0);
225:
226: }
227: else if (orientation == PlotOrientation.VERTICAL) {
228:
229: rectX = domainAxis.getCategoryStart(column, getColumnCount(),
230: dataArea, domainAxisLocation);
231:
232: if (seriesCount > 1) {
233: double seriesGap = dataArea.getWidth() * getItemMargin()
234: / (categoryCount * (seriesCount - 1));
235: rectX = rectX + row * (state.getBarWidth() + seriesGap);
236: }
237: else {
238: rectX = rectX + row * state.getBarWidth();
239: }
240:
241: rectY = java2dValue0;
242:
243: }
244: Rectangle2D bar = new Rectangle2D.Double(rectX, rectY, rectWidth,
245: rectHeight);
246: Paint seriesPaint = getItemPaint(row, column);
247: g2.setPaint(seriesPaint);
248: g2.fill(bar);
249:
250:
251: if (state.getBarWidth() > BAR_OUTLINE_WIDTH_THRESHOLD) {
252: Stroke stroke = getItemOutlineStroke(row, column);
253: Paint paint = getItemOutlinePaint(row, column);
254: if (stroke != null && paint != null) {
255: g2.setStroke(stroke);
256: g2.setPaint(paint);
257: g2.draw(bar);
258: }
259: }
260:
261: CategoryItemLabelGenerator generator = getItemLabelGenerator(row,
262: column);
263: if (generator != null && isItemLabelVisible(row, column)) {
264: drawItemLabel(g2, dataset, row, column, plot, generator, bar,
265: false);
266: }
267:
268:
269: if (state.getInfo() != null) {
270: EntityCollection entities = state.getEntityCollection();
271: if (entities != null) {
272: String tip = null;
273: CategoryToolTipGenerator tipster
274: = getToolTipGenerator(row, column);
275: if (tipster != null) {
276: tip = tipster.generateToolTip(dataset, row, column);
277: }
278: String url = null;
279: if (getItemURLGenerator(row, column) != null) {
280: url = getItemURLGenerator(row, column).generateURL(
281: dataset, row, column);
282: }
283: CategoryItemEntity entity = new CategoryItemEntity(bar, tip,
284: url, dataset, dataset.getRowKey(row),
285: dataset.getColumnKey(column));
286: entities.add(entity);
287: }
288: }
289:
290: }
291:
292: }