package org.limewire.ui.swing.components;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.event.HyperlinkListener;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.StyleSheet;
import org.jdesktop.application.Resource;
import org.limewire.ui.swing.util.GuiUtils;
/**
* Label that understands HTML text and allows users to add a {@link HyperlinkListener}.
* <p>
* A default
*/
public class HTMLLabel extends JEditorPane {
public static final Color TRANSPARENT_COLOR = new Color(0, 0, 0, 0);
private StyleSheet fontStyle = null;
private StyleSheet colorStyle = null;
private StyleSheet linkStyle = null;
private final StyleSheet mainStyle;
private Font htmlFont = null;
private Color htmlFontColor;
@Resource
private Color linkColor = Color.BLUE;
/**
* null if listener is not set and installed, otherwise set.
*/
private HyperlinkListener openInNativeBrowserListener = GuiUtils.getHyperlinkListener();
/**
* Initializes the label with <code>htmlText</code>
*/
public HTMLLabel(String htmlText) {
super("text/html", htmlText);
GuiUtils.assignResources(this);
setEditable(false);
setCaretPosition(0);
mainStyle = ((HTMLDocument)getDocument()).getStyleSheet();
setSelectionColor(TRANSPARENT_COLOR);
setHtmlLinkForeground(linkColor);
addHyperlinkListener(openInNativeBrowserListener);
// make it mimic a JLabel
JLabel label = new JLabel();
setBackground(label.getBackground());
setHtmlFont(label.getFont());
}
/**
* Creates a label with no text.
*/
public HTMLLabel() {
this(null);
}
/**
* Enable or disable a listener that opens hyper links that point to
* full URLs natively. Enabled by default.
*/
public void setOpenUrlsNatively(boolean enable) {
if (enable) {
if (openInNativeBrowserListener == null) {
openInNativeBrowserListener = GuiUtils.getHyperlinkListener();
addHyperlinkListener(openInNativeBrowserListener);
} else {
// already installed
}
} else {
if (openInNativeBrowserListener != null) {
removeHyperlinkListener(openInNativeBrowserListener);
openInNativeBrowserListener = null;
} else {
// not installed
}
}
}
/**
* @return the font used for rendering the HTML text, or null if none
* has been set
*/
public Font getHtmlFont() {
return htmlFont;
}
/**
* Sets the font for rendering the HTML text.
* @param font must not be null
*/
public void setHtmlFont(Font font) {
htmlFont = font;
if (fontStyle != null) {
mainStyle.removeStyleSheet(fontStyle);
}
fontStyle = new StyleSheet();
fontStyle.addRule(createCSS(font));
mainStyle.addStyleSheet(fontStyle);
}
/**
* Sets the foreground color of the HTML text.
* @param color must not be null
*/
public void setHtmlForeground(Color color) {
htmlFontColor = color;
if (colorStyle != null) {
mainStyle.removeStyleSheet(colorStyle);
}
colorStyle = new StyleSheet();
colorStyle.addRule(createCSS(color));
mainStyle.addStyleSheet(colorStyle);
}
private String createCSS(Color color) {
StringBuilder builder = new StringBuilder("body {");
builder.append("color: ").append(GuiUtils.colorToHex(color)).append(";");
builder.append("}");
return builder.toString();
}
/**
* @return the foreground color used for rendering HTML text, null if none
* is set
*/
public Color getHtmlForeground() {
return htmlFontColor;
}
public void setHtmlLinkForeground(Color color) {
linkColor = color;
if (linkStyle != null) {
mainStyle.removeStyleSheet(linkStyle);
}
linkStyle = new StyleSheet();
linkStyle.addRule(createLinkCSS(color));
mainStyle.addStyleSheet(linkStyle);
}
private String createLinkCSS(Color color) {
StringBuilder builder = new StringBuilder("body a {");
builder.append("color: ").append(GuiUtils.colorToHex(color)).append(";");
builder.append("}");
return builder.toString();
}
private String createCSS(Font font) {
StringBuilder builder = new StringBuilder("body {");
builder.append("font-family: ").append(font.getFamily()).append(";");
builder.append("font-size: ").append(font.getSize()).append("pt;");
if (font.isItalic()) {
builder.append("font-style: italic;");
}
if (font.isBold()) {
builder.append("font-weight: bold;");
}
builder.append("}");
return builder.toString();
}
}