package br.ufpr.c3sl.view.util;
import java.awt.AWTEventMulticaster;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.FilteredImageSource;
import java.awt.image.RGBImageFilter;
import java.net.URL;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class ImageButton extends JPanel {
protected ActionListener actionListener = null;
int w, h;
boolean clicked;
boolean down;
boolean enabled;
Image UPimage;
Image DOWNimage;
Image disabledimage;
public ImageButton(URL up_b, URL down_b) {
clicked = false;
down = false;
enabled = true;
initImage(up_b, down_b);
setSize(w, h);
addMouseListener(new ImageButtonMouseListener());
addMouseMotionListener(new ImageButtonMouseMotionListener());
}
public ImageButton(Image up, Image down) {
this.clicked = false;
this.down = false;
this.enabled = true;
initImage(up, down);
setSize(w, h);
addMouseListener(new ImageButtonMouseListener());
addMouseMotionListener(new ImageButtonMouseMotionListener());
}
public void initImage(URL up, URL down) {
UPimage = getToolkit().getImage(up);
DOWNimage = getToolkit().getImage(down);
initImage(UPimage, DOWNimage);
}
public void initImage(Image up, Image down) {
MediaTracker tracker;
try {
UPimage = up;
DOWNimage = down;
tracker = new MediaTracker(this);
tracker.addImage(UPimage, 0);
tracker.addImage(DOWNimage, 1);
tracker.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
disabledimage = createImage(new FilteredImageSource(
UPimage.getSource(), new ImageButtonDisableFilter()));
w = UPimage.getWidth(this);
h = UPimage.getHeight(this);
}
public void paint(Graphics g) {
g.clearRect(0, 0, getSize().width, getSize().height);
g.setColor(getBackground());
g.fillRect(0, 0, getSize().width, getSize().height);
if (down) {
g.drawImage(DOWNimage, 0, 0, this);
} else {
if (enabled) {
g.drawImage(UPimage, 0, 0, this);
} else {
g.drawImage(disabledimage, 0, 0, this);
}
}
}
public void setEnabled(boolean b) {
enabled = b;
repaint();
}
public boolean isEnabled() {
return (enabled);
}
public void addActionListener(ActionListener l) {
actionListener = AWTEventMulticaster.add(actionListener, l);
}
public void removeActionListener(ActionListener l) {
actionListener = AWTEventMulticaster.remove(actionListener, l);
}
public class ImageButtonMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
Point p = e.getPoint();
if ((p.x < w) && (p.y < h) && (p.x > 0) && (p.y > 0)
&& (enabled == true)) {
clicked = true;
down = true;
repaint();
}
}
public void mouseReleased(MouseEvent e) {
Point p = e.getPoint();
if (down) {
down = false;
repaint();
}
if ((p.x < w) && (p.y < h) && (p.x > 0) && (p.y > 0)
&& (clicked == true)) {
ActionEvent ae = new ActionEvent(e.getComponent(), 0, "click");
if (actionListener != null) {
actionListener.actionPerformed(ae);
}
}
clicked = false;
}
}
public class ImageButtonMouseMotionListener extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
Point p = e.getPoint();
if ((p.x < w) && (p.y < h) && (p.x > 0) && (p.y > 0)
&& (clicked == true)) {
if (down == false) {
down = true;
repaint();
}
} else {
if (down == true) {
down = false;
repaint();
}
}
}
}
public Dimension getPreferredSize() {
return (new Dimension(UPimage.getWidth(this), UPimage.getHeight(this)));
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
class ImageButtonDisableFilter extends RGBImageFilter {
public ImageButtonDisableFilter() {
canFilterIndexColorModel = true;
}
public int filterRGB(int x, int y, int rgb) {
//return(rgb & ~0xff000000) | 0x80000000;
return ((rgb & 0xff00ff00)
| ((rgb & 0xff0000) >> 16)
| ((rgb & 0xff) << 16));
}
}
}