package org.chartsy.main.axis;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.io.Serializable;
import java.util.Calendar;
import javax.swing.JPanel;
import org.chartsy.main.ChartFrame;
import org.chartsy.main.ChartProperties;
import org.chartsy.main.data.ChartData;
import org.chartsy.main.data.Dataset;
import org.chartsy.main.intervals.Interval;
import org.chartsy.main.intervals.WeeklyInterval;
import org.chartsy.main.utils.CoordCalc;
import org.chartsy.main.utils.GraphicsUtils;
import org.chartsy.main.utils.SerialVersion;
import org.openide.util.NbBundle;
/**
*
* @author viorel.gheba
*/
public class DateAxis extends JPanel implements Serializable
{
private static final long serialVersionUID = SerialVersion.APPVERSION;
private ChartFrame chartFrame;
public DateAxis(ChartFrame frame)
{
chartFrame = frame;
setOpaque(false);
setDoubleBuffered(true);
}
@Override
public void paint(Graphics g)
{
Graphics2D g2 = GraphicsUtils.prepareGraphics(g);
ChartData cd = chartFrame.getChartData();
ChartProperties cp = chartFrame.getChartProperties();
String copy = NbBundle.getMessage(ChartFrame.class, "LBL_Copyright", Integer.toString(Calendar.getInstance().get(Calendar.YEAR)));
g2.setColor(chartFrame.getChartProperties().getFontColor());
g2.setFont(chartFrame.getChartProperties().getFont().deriveFont(Font.BOLD));
g2.drawString(copy, 0, getHeight() - 5);
if (!cd.isVisibleNull() && !cd.getVisible().isEmpty())
{
Rectangle bounds = chartFrame.getSplitPanel().getChartPanel().getBounds();
Dataset dataset = cd.getVisible();
Interval interval = cd.getInterval();
g2.setFont(cp.getFont());
g2.setColor(cp.getAxisColor());
g2.setStroke(cp.getAxisStroke());
g2.drawLine(0, 0, bounds.width, 0);
bounds.grow(-2, -2);
String[] months = cp.getMonths();
FontRenderContext frc = g2.getFontRenderContext();
LineMetrics lm = cp.getFont().getLineMetrics("0123456789/", g2.getFontRenderContext());
Calendar calendar = Calendar.getInstance();
double[] list = cd.getDateValues();
if (!interval.isIntraDay())
{
boolean firstFlag = true;
for (int j = 0; j < list.length; j++)
{
double value = list[j];
if (value != -1)
{
double x = cd.getX(value, bounds);
calendar.setTimeInMillis(dataset.getTimeAt(j));
String string = months[calendar.get(Calendar.MONTH)];
if (string.isEmpty())
{
string = String.valueOf(calendar.get(Calendar.YEAR)).substring(2);
} else
{
if (interval instanceof WeeklyInterval)
string = string.substring(0, 1);
}
double h = cp.getFont().getStringBounds(string, frc).getHeight();
if (firstFlag)
{
int index = (int) value;
long time = dataset.getTimeAt(index);
if (!cd.isFirstWorkingDayOfMonth(time))
{
double nvalue = 0;
for (int k = j + 1; k < list.length; k++)
if (list[k] != -1)
{
nvalue = list[k];
break;
}
double nx = cd.getX(nvalue, bounds);
double w = cp.getFont().getStringBounds(string, frc).getWidth();
if (nx - x > w + 5)
{
g2.setColor(cp.getFontColor());
g2.drawString(string, (float)(x + 5), lm.getAscent());
}
} else
{
g2.setColor(cp.getAxisColor());
g2.draw(CoordCalc.line(x, 0, x, h));
g2.setColor(cp.getFontColor());
g2.drawString(string, (float)(x + 5), lm.getAscent());
}
firstFlag = false;
} else
{
g2.setColor(cp.getAxisColor());
g2.draw(CoordCalc.line(x, 0, x, h));
g2.setColor(cp.getFontColor());
g2.drawString(string, (float)(x + 5), lm.getAscent());
}
}
}
}
else
{
for (int j = 0; j < list.length; j++)
{
double value = list[j];
if (value != -1)
{
double x = cd.getX(value, bounds);
calendar.setTimeInMillis(dataset.getTimeAt(j));
StringBuilder sb = new StringBuilder();
if (calendar.get(Calendar.HOUR_OF_DAY) < 10)
sb.append("0");
sb.append(String.valueOf(calendar.get(Calendar.HOUR_OF_DAY)));
sb.append(":");
if (calendar.get(Calendar.MINUTE) < 10)
sb.append("0");
sb.append(String.valueOf(calendar.get(Calendar.MINUTE)));
String label = sb.toString();
double h = cp.getFont().getStringBounds(label, frc).getHeight();
g2.setColor(cp.getAxisColor());
g2.draw(CoordCalc.line(x, 0, x, h));
g2.setColor(cp.getFontColor());
g2.drawString(label, (float)(x + 5), lm.getAscent());
}
}
}
}
}
@Override
public void update(Graphics g)
{
paint(g);
}
}