package cx.prutser.sudoku.capture;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
/**
* @author Erik van Zijst
*/
public class ApertureImage extends JPanel implements MouseListener, MouseMotionListener {
private static final int RADIUS = 7;
private final int width;
private final int height;
private BufferedImage image;
private int[] x = new int[4];
private int[] y = new int[4];
private int selected = -1;
private boolean fixed = false;
public ApertureImage(BufferedImage image) {
setBorder(BorderFactory.createLineBorder(Color.BLACK));
this.image = image;
width = image.getWidth();
height = image.getHeight();
x[0] = (int)(width * 0.1);
y[0] = (int)(height * 0.1);
x[1] = (int)(width * 0.9);
y[1] = (int)(height * 0.1);
x[2] = (int)(width * 0.9);
y[2] = (int)(height * 0.9);
x[3] = (int)(width * 0.1);
y[3] = (int)(height * 0.9);
addMouseListener(this);
addMouseMotionListener(this);
}
public Dimension getPreferredSize() {
return new Dimension(width, height);
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
public java.util.List<Point> getCorners() {
final java.util.List points = new ArrayList<Point>();
for (int i = 0; i < x.length; i++) {
points.add(new Point(x[i], y[i]));
}
return points;
}
public void mouseDragged(MouseEvent e) {
if (selected > -1 && !fixed) {
x[selected] = Math.max(0, Math.min(width, e.getX()));
y[selected] = Math.max(0, Math.min(height, e.getY()));
repaint();
}
}
public void setImage(BufferedImage image) {
this.image = image;
repaint();
}
public void setFixed(boolean fixed) {
this.fixed = fixed;
repaint();
}
public void mouseMoved(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
if (!fixed) {
selected = -1;
for (int i = 0; i < x.length; i++) {
if (isHit(x[i], y[i], e.getX(), e.getY())) {
selected = i;
}
}
repaint();
}
}
private boolean isHit(int x, int y, int mouseX, int mouseY) {
return mouseX > x - RADIUS && mouseX < x + RADIUS &&
mouseY > y - RADIUS && mouseY < y + RADIUS;
}
public void mouseReleased(MouseEvent e) {
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.clearRect(0, 0, width, height);
g2.drawImage(image, (width - image.getWidth()) / 2, (height - image.getHeight()) / 2, null);
if (!fixed) {
g2.setPaint(Color.white);
g2.drawPolygon(x, y, 4);
}
}
}