package org.chartsy.chatsy.chat.ui;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
public class ImageSelectionPanel extends JPanel
{
private BufferedImage image;
private Rectangle clip;
public ImageSelectionPanel()
{
}
public void setImage(BufferedImage image)
{
this.image = image;
clip = new Rectangle();
setBackground(Color.black);
Selector selector = new Selector(this);
addMouseListener(selector);
addMouseMotionListener(selector);
}
protected void paintComponent(Graphics g)
{
if (image == null)
return;
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
int imageWidth = image.getWidth();
int imageHeight = image.getHeight();
int x = (w - imageWidth) / 2;
int y = (h - imageHeight) / 2;
AffineTransform at = AffineTransform.getTranslateInstance(x, y);
g2.drawRenderedImage(image, at);
g2.setPaint(Color.LIGHT_GRAY);
g2.draw(clip);
}
public void setClipFrame(Point start, Point end)
{
clip.setFrameFromDiagonal(start, end);
repaint();
}
public Dimension getPreferredSize()
{
return new Dimension(image.getWidth(), image.getHeight());
}
public Rectangle getClip()
{
return clip;
}
public void clear()
{
image = null;
}
}
class Selector extends MouseInputAdapter
{
ImageSelectionPanel selectionPanel;
Point start;
boolean dragging, isClipSet;
public Selector(ImageSelectionPanel isp)
{
selectionPanel = isp;
dragging = false;
isClipSet = false;
}
public void mousePressed(MouseEvent e)
{
if (isClipSet)
{
selectionPanel.setClipFrame(start, start);
isClipSet = false;
}
else
{
start = e.getPoint();
dragging = true;
isClipSet = true;
}
}
public void mouseReleased(MouseEvent e)
{
dragging = false;
}
public void mouseDragged(MouseEvent e)
{
if (dragging)
selectionPanel.setClipFrame(start, e.getPoint());
}
}