package org.limewire.ui.swing.components;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.Action;
import javax.swing.JButton;
import org.jdesktop.application.Resource;
import org.limewire.ui.swing.util.FontUtils;
import org.limewire.ui.swing.util.GuiUtils;
/**
* Creates a button that is undecorated and its text behaves like a hyperlink.
* On mouse over the text changes colors and the cursor changes to a hand as
* is expected for a hyperlink.
*/
public class HyperlinkButton extends JButton implements MouseListener {
private final HyperlinkButtonResources r = new HyperlinkButtonResources();
public HyperlinkButton() {
initialize();
}
public HyperlinkButton(Action action) {
super(action);
initialize();
}
public HyperlinkButton(String text) {
initialize();
setText(text);
}
public HyperlinkButton(String text, Action action) {
super(action);
setHideActionText(true);
setText(text);
initialize();
}
private void initialize() {
this.setUI(new CustomHyperlinkUI());
addMouseListener(this);
FontUtils.underline(this);
}
@Override
public void setFont(Font font) {
super.setFont(font);
if(!FontUtils.isUnderlined(this)) {
FontUtils.underline(this);
}
}
public void removeUnderline() {
Font font = getFont();
if (font != null) {
super.setFont(FontUtils.deriveUnderline(font, false));
}
}
/**
* Shared method to update foreground according to mouse and enabled status.
*/
private void updateForeground() {
if (isEnabled()) {
if (getModel().isRollover()) {
super.setForeground(r.rolloverForeground);
} else {
super.setForeground(r.foreground);
}
} else {
super.setForeground(r.disabledForeground);
}
}
// Separated setting the foreground temporarily and setting the foreground
// permanently to avoid limewire l&f violations
//
public void setNormalForeground(Color color) {
r.foreground = color;
updateForeground();
}
public void setRolloverForeground(Color color) {
r.rolloverForeground = color;
updateForeground();
}
public void setDisabledForeground(Color color) {
r.disabledForeground = color;
updateForeground();
}
// Uncomment to expose lw look and feel violations
// @Override
// public void setForeground(Color c) {
// new IllegalArgumentException().printStackTrace();
// }
@Override
public void setEnabled(boolean value) {
super.setEnabled(value);
if(r != null) {
updateForeground();
}
}
@Override
public void mouseEntered(MouseEvent e) {
updateForeground();
}
@Override
public void mouseExited(MouseEvent e) {
updateForeground();
}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {}
private class HyperlinkButtonResources {
@Resource Color rolloverForeground;
@Resource Color foreground;
@Resource Color disabledForeground;
public HyperlinkButtonResources() {
GuiUtils.assignResources(this);
HyperlinkButton.super.setForeground(foreground);
}
}
}