package com.webfoot.prefuse; import java.awt.Shape; import java.awt.geom.Rectangle2D; import prefuse.Constants; import prefuse.render.AbstractShapeRenderer; import prefuse.visual.VisualItem; /* * This class renders bars like those you'd use in a bar chart. * Some code was borrowed from StackedAreaChart; some from ShapeRenderer. * * @author Kaitlin Duck Sherwood * @author jeffrey heer */ public class BarRenderer extends AbstractShapeRenderer { private Rectangle2D m_bounds; private boolean m_isVertical; private int m_orientation = Constants.ORIENT_BOTTOM_TOP; protected int m_barWidth = 10; protected Rectangle2D m_rect = new Rectangle2D.Double(); public BarRenderer(int aWidth) { // super(barWidth); m_barWidth = aWidth; setOrientation(m_orientation); } public void setBounds(Rectangle2D bounds) { m_bounds = bounds; } /** * Sets the orientation of this layout. Must be one of * {@link Constants#ORIENT_BOTTOM_TOP} (to grow bottom-up), * {@link Constants#ORIENT_TOP_BOTTOM} (to grow top-down), * {@link Constants#ORIENT_LEFT_RIGHT} (to grow left-right), or * {@link Constants#ORIENT_RIGHT_LEFT} (to grow right-left). * @param orient the desired orientation of this layout * @throws IllegalArgumentException if the orientation value * is not a valid value */ public void setOrientation(int orient) { if ( orient != Constants.ORIENT_TOP_BOTTOM && orient != Constants.ORIENT_BOTTOM_TOP && orient != Constants.ORIENT_LEFT_RIGHT && orient != Constants.ORIENT_RIGHT_LEFT) { throw new IllegalArgumentException( "Invalid orientation value: "+orient); } m_orientation = orient; m_isVertical = (m_orientation == Constants.ORIENT_TOP_BOTTOM || m_orientation == Constants.ORIENT_BOTTOM_TOP); } protected Shape getRawShape(VisualItem item) { double width, height; double x = item.getX(); if ( Double.isNaN(x) || Double.isInfinite(x) ) x = 0; double y = item.getY(); if ( Double.isNaN(y) || Double.isInfinite(y) ) y = 0; if(m_isVertical) { // @@@ what is the getSize for? width = m_barWidth*item.getSize(); if(m_orientation == Constants.ORIENT_BOTTOM_TOP) { height = m_bounds.getMaxY() - y; } else { height = y; y = m_bounds.getMinY(); } // Center the bar around the x-location if ( width > 1 ) { x = x-width/2; } } else { height = m_barWidth*item.getSize(); if(m_orientation == Constants.ORIENT_LEFT_RIGHT) { width = x; x = m_bounds.getMinX(); } else { width = m_bounds.getMaxX() - x; } // Center the bar around the y-location if ( height > 1 ) { y = y-height/2; } } m_rect.setFrame(x, y, width, height); return m_rect; } }