/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.spark.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;
/**
* Allows for selection of panel images.
*/
public class ImageSelectionPanel extends JPanel {
private static final long serialVersionUID = -2832575315956252059L;
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) // clear existing clip
{
selectionPanel.setClipFrame(start, start);
isClipSet = false;
}
else // or start new clip
{
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());
}
}