blob: b855ac8b61706e9530356ef80e6669414a524095 [file] [log] [blame]
package org.netbeans.paint;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.swing.JComponent;
/**
*
* @author Tim Boudreau
*/
public class PaintCanvas extends JComponent {
private int brushDiameter = 10;
private final MouseL mouseListener = new MouseL();
private BufferedImage backingImage = null;
private final BrushSizeView brushView = new BrushSizeView();
private Color color = Color.BLUE;
public PaintCanvas() {
addMouseListener(mouseListener);
addMouseMotionListener(mouseListener);
setBackground(Color.WHITE);
setFocusable(true);
}
public void setBrush(int diam) {
this.brushDiameter = diam;
}
public void setBrushDiameter(int val) {
this.brushDiameter = val;
brushView.repaint();
}
public int getBrushDiameter() {
return brushDiameter;
}
public void setColor(Color c) {
this.color = c;
brushView.repaint();
}
public Color getColor() {
return color;
}
public void clear() {
backingImage = null;
repaint();
}
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawRenderedImage(getImage(), AffineTransform.getTranslateInstance(0, 0));
}
JComponent getBrushSizeView() {
return brushView;
}
public BufferedImage getImage() {
int width = Math.min(getWidth(), 1600);
int height = Math.min(getHeight(), 1200);
if (backingImage == null || backingImage.getWidth() != width || backingImage.getHeight() != height) {
int newWidth = backingImage == null ? width : Math.max(width, backingImage.getWidth());
int newHeight = backingImage == null ? height : Math.max(height, backingImage.getHeight());
if (newHeight > height && newWidth > width && backingImage != null) {
return backingImage;
}
BufferedImage old = backingImage;
backingImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB_PRE);
Graphics2D g = backingImage.createGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
if (old != null) {
g.drawRenderedImage(old,
AffineTransform.getTranslateInstance(0, 0));
}
g.dispose();
setPreferredSize(new Dimension (newWidth, newHeight));
}
return backingImage;
}
private class BrushSizeView extends JComponent {
@Override
public void paint(Graphics g) {
((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Point p = new Point(getWidth() / 2, getHeight() / 2);
int half = getBrushDiameter() / 2;
int diam = getBrushDiameter();
g.setColor(getColor());
g.fillOval(p.x - half, p.y - half, diam, diam);
}
@Override
public Dimension getPreferredSize() {
return new Dimension (24, 24);
}
}
private final class MouseL extends MouseAdapter implements MouseMotionListener {
@Override
public void mouseClicked(MouseEvent e) {
Point p = e.getPoint();
int half = brushDiameter / 2;
Graphics2D g = getImage().createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setPaint(getColor());
g.fillOval(p.x - half, p.y - half, brushDiameter, brushDiameter);
g.dispose();
repaint(p.x - half, p.y - half, brushDiameter, brushDiameter);
}
@Override
public void mouseDragged(MouseEvent e) {
mouseClicked(e);
}
}
}