import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
public class DefaultWatchView implements WatchView {
@Override
public void draw(Graphics g, GraphicWatch w) {
Graphics2D g2 = (Graphics2D) g;
drawDial(g2, w);
drawShortHand(g2, w);
drawMinuteHand(g2, w);
drawSecondHand(g2, w);
}
public void drawDial(Graphics g, GraphicWatch w) {
Graphics2D g2D = (Graphics2D) g;
g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2D.setBackground(Color.BLACK);
Point pos = w.getPos();
int size = w.getSize();
g2D.fillOval((int) (pos.x), (int) (pos.y), (int) size, (int) size);
g2D.setColor(Color.WHITE);
g2D.setStroke(new BasicStroke(2));
g2D.drawOval(pos.x, pos.y, size, size);
drawNumbers(g2D, w);
}
private void drawNumbers(Graphics2D g2d, GraphicWatch w) {
Point pos = w.getCenter();
g2d.setStroke(new BasicStroke(10));
g2d.setColor(Color.WHITE);
double angle;
int x, y;
double radius = w.getRadius() * .8;
Font font = g2d.getFont().deriveFont((float) (radius / 3));
int fontSize = font.getSize();
g2d.setFont(font);
FontMetrics fm = g2d.getFontMetrics();
for (int i = 1; i <= Watch.HOUR_PER_DAY / 2; i++) {
angle = i * Math.PI / 6;
x = (int) (radius * Math.sin(angle));
y = (int) (radius * Math.cos(angle));
String val = i + "";
int width = fm.stringWidth(val);
g2d.drawString(val, pos.x + x - width / 2, pos.y - y + fontSize / 2);
}
}
public void drawHand(GraphicWatch w, Graphics2D g, Point handPos) {
Point center = w.getCenter();
g.drawLine(center.x, center.y, handPos.x, handPos.y);
}
private void drawMinuteHand(Graphics2D g2, GraphicWatch w) {
Point handPos = getHandTopPos(w, w.getMinutes(), Watch.MIN_PER_HOUR, 3 * w.getRadius() / 4);
g2.setColor(Color.WHITE);
g2.setStroke(new BasicStroke(1.5f));
drawHand(w, g2, handPos);
}
private void drawSecondHand(Graphics2D g2, GraphicWatch w) {
Point handPos = getHandTopPos(w, w.getSeconds(), Watch.SEC_PER_MIN, 7 * w.getRadius() / 8);
g2.setColor(Color.RED);
g2.setStroke(new BasicStroke(1.5f));
drawHand(w, g2, handPos);
Point center = w.getCenter();
int size = (int)(w.getSize()*.07);
g2.fillOval(center.x-size/2, center.y-size/2, size, size);
}
private void drawShortHand(Graphics2D g2, GraphicWatch w) {
Point handPos = getHandTopPos(w, w.getHours(), Watch.HOUR_PER_DAY / 2, w.getRadius() / 2);
g2.setColor(Color.WHITE);
g2.setStroke(new BasicStroke(2.5f));
drawHand(w, g2, handPos);
}
private Point getHandTopPos(GraphicWatch w, int timeValue, int maxTimeValue, double handSize) {
Point pos = w.getPos();
Point center = w.getCenter();
double angle = timeToAngle(timeValue, maxTimeValue);
pos.x = center.x + (int) ((int) handSize * Math.cos(angle));
pos.y = center.y + (int) ((int) handSize * Math.sin(angle));
return pos;
}
private double timeToAngle(int time, int maxTime) {
return Math.toRadians((time * (360.0 / maxTime)) - 90);
}
}