package org.lemsml.jlems.viz.plot;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.border.Border;
public final class RolloverEffect extends MouseAdapter {
JComponent button;
int inormal;
int iactive;
Border normalBorder;
Border activeBorder;
public final static int NONE = 0;
public final static int ETCHED_DOWN = 1;
public final static int ETCHED_UP = 2;
public final static int RAISED = 2;
Color bgColor;
int pL;
int pR;
int pT;
int pB;
private boolean hasPadding;
public RolloverEffect(JComponent buttonIn) {
this(buttonIn, ETCHED_DOWN, ETCHED_UP);
}
public RolloverEffect(JComponent buttonIn, int norm, int active) {
super();
hasPadding = false;
bgColor = buttonIn.getBackground();
inormal = norm;
iactive = active;
button = buttonIn;
makeBorders();
if (button instanceof AbstractButton) {
((AbstractButton)button).setBorderPainted(true);
} else if (button instanceof JMenu) {
((JMenu)button).setBorderPainted(true);
} else if (button instanceof JCheckBox) {
((JCheckBox)button).setBorderPainted(true);
} else if (button instanceof JPanel) {
// ((JPanel)button).setBorderPainted(true);
}
mouseExited(null);
}
public void setPadding(int p) {
setPadding(p, p, p, p);
}
public void setPadding(int pl, int pr, int pt, int pb) {
pL = pl;
pR = pr;
pT = pt;
pB = pb;
hasPadding = true;
makeBorders();
mouseExited(null);
}
public void setBg(Color c) {
bgColor = c;
makeBorders();
mouseExited(null);
}
public void makeBorders() {
normalBorder = makeBorder(inormal);
activeBorder = makeBorder(iactive);
}
public void mouseEntered(MouseEvent me) {
button.setBorder(activeBorder);
}
public void mouseExited(MouseEvent me) {
button.setBorder(normalBorder);
}
private Border makeBorder(int type) {
Color c = bgColor;
Color cbr = myBrighter(c);
Color cdk = myDarker(c);
Border ret = null;
if (type == ETCHED_DOWN) {
// ret = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
ret = BorderFactory.createEtchedBorder(cbr, cdk);
} else if (type == ETCHED_UP) {
// ret = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
ret = BorderFactory.createEtchedBorder(cdk, cbr);
} else {
ret = BorderFactory.createEmptyBorder(2, 2, 2, 2);
}
if (hasPadding) {
Border bdr = BorderFactory.createEmptyBorder(pT, pL, pB, pR);
ret = BorderFactory.createCompoundBorder(ret, bdr);
}
return ret;
}
public static Color myBrighter(Color c) {
return linMod(c, 35);
}
public static Color myDarker(Color c) {
return linMod(c, -35);
}
public static Color linMod(Color c, int d) {
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
r += d;
g += d;
b += d;
r = (r > 0 ? (r < 255 ? r : 255) : 0);
g = (g > 0 ? (g < 255 ? g : 255) : 0);
b = (b > 0 ? (b < 255 ? b : 255) : 0);
return new Color(r, g, b);
}
}