package com.limegroup.gnutella.gui.statistics.panes;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.border.AbstractBorder;
import com.limegroup.gnutella.gui.statistics.StatisticsMediator;
/**
* Draws the border of a graph based on the supplied criteria.
*/
final class GraphBorder extends AbstractBorder {
/**
* The offset between the left most pixel of this component and
* where the axis are drawn.
*/
private static final int OFFSET = 30;
/**
* The number of tick marks on the x axis.
*/
private final int NUM_X_TICKS;
/**
* The <tt>GraphAxisData</tt> instance containing all data for
* axis scale and display.
*/
private final GraphAxisData DATA;
/**
* Creates a new <tt>GraphBorder</tt> instance with the specified number
* of values between x and y hash marks.
*
* @param xIncrement the number of values between x-axis hash marks
* @param yIncrement the number of values between y-axis hash marks
*/
GraphBorder(GraphAxisData data) {
DATA = data;
NUM_X_TICKS = DATA.getTotalXValues()/DATA.getXIncrement();
}
/**
* Paints the x and y axis of the graph.
*/
public void paintBorder(Component comp, Graphics g, int x,
int y, int width, int height) {
// the thickness of the axis lines
int thickness = 2;
int yVal = 0;
int xVal = 0;
int yBase = y+height-OFFSET;
JComponent component =
StatisticsMediator.getStatDisplayComponent();
int xAxisPixelLength = component.getWidth()-OFFSET;
int yAxisPixelLength = component.getHeight()-OFFSET-60;
for(int i=0; i<thickness; i++) {
yVal = y+height-i-OFFSET;
// draw x-axis
g.drawLine(x+OFFSET, yVal, xAxisPixelLength, yVal);
// draw y-axis
xVal = x+i+OFFSET;
int yTop = yBase-yAxisPixelLength;
g.drawLine(xVal, yTop, xVal, yBase);
}
Font oldFont = g.getFont();
Font tempFont = new Font(oldFont.getName(),
oldFont.getStyle(),
oldFont.getSize()-1);
g.setFont(tempFont);
drawHashedLineX(x+OFFSET, yVal, g);
drawHashedLineY(xVal, y, yBase, g);
g.setFont(oldFont);
}
/**
* Accessor for the offset of the x and y axis.
*
* @return the offset, in pixels of the x and y axis
*/
static int getOffset() {
return OFFSET;
}
/**
* Draws the hashes along the x axis.
*
* @param x0 the starting x position
* @param y0 the starting y position
* @param g the <tt>Graphics</tt> instance for doing the drawing
*/
private void drawHashedLineX(int x0, int y0, Graphics g) {
int startY = y0-4;
int endY = y0+4;
double curX = x0;
int xInc = DATA.getXIncrement();
JComponent component =
StatisticsMediator.getStatDisplayComponent();
double drawingWidth = (double)(component.getWidth()-OFFSET-x0);
double xVal = drawingWidth/(double)DATA.getTotalXValues();
for(int i=0, num=DATA.getTotalXValues()/xInc+1;
i<num; i++) {
g.drawLine((int)curX, startY, (int)curX, endY);
g.drawString(new Integer((NUM_X_TICKS-i)*xInc).toString(),
(int)curX, startY+20);
curX += xVal*(double)xInc;
}
g.drawString(DATA.getXAxisLabel()+" vs. "+DATA.getYAxisLabel(), (int)((drawingWidth/2)-20), y0+30);
}
/**
* Draws the hashes along the y axis.
*
* @param x0 the starting x position
* @param y0 the starting y position
* @param y1 the ending y position
* @param g the <tt>Graphics</tt> instance for doing the drawing
*/
private void drawHashedLineY(int x0, int y0, int y1, Graphics g) {
int startX = x0-4;
int endX = x0+4;
double curY = y1;
int yInc = DATA.getYIncrement();
JComponent component =
StatisticsMediator.getStatDisplayComponent();
double yVal = (double)(component.getHeight()-OFFSET-y0-60)/
(double)DATA.getTotalYValues();
double pixelJump = yVal*(double)yInc;
for(int i=0, num=(DATA.getTotalYValues()/yInc)+1;
i<num; i++, curY -= pixelJump) {
g.drawLine(startX, (int)curY, endX, (int)curY);
g.drawString(new Integer(i*yInc).toString(),
startX-20, (int)curY);
}
}
}