00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.gui.label;
00023
00024 import com.realtime.crossfire.jxclient.gui.gui.GUIElementListener;
00025 import com.realtime.crossfire.jxclient.gui.gui.GuiUtils;
00026 import com.realtime.crossfire.jxclient.gui.gui.TooltipManager;
00027 import java.awt.Color;
00028 import java.awt.Dimension;
00029 import java.awt.Font;
00030 import java.awt.FontMetrics;
00031 import java.awt.Graphics;
00032 import java.awt.image.BufferedImage;
00033 import java.io.IOException;
00034 import java.io.Reader;
00035 import java.io.StringReader;
00036 import java.util.regex.Pattern;
00037 import javax.swing.text.html.HTMLEditorKit;
00038 import javax.swing.text.html.parser.ParserDelegator;
00039 import org.jetbrains.annotations.NotNull;
00040 import org.jetbrains.annotations.Nullable;
00041
00046 public class GUIHTMLLabel extends AbstractLabel {
00047
00051 private static final long serialVersionUID = 1;
00052
00056 private static final int AUTO_BORDER_SIZE = 2;
00057
00061 @NotNull
00062 private static final Pattern PATTERN_LINE_BREAK = Pattern.compile("<br>");
00063
00067 private boolean autoResize = false;
00068
00081 public GUIHTMLLabel(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @Nullable final BufferedImage backgroundPicture, @NotNull final Font font, @NotNull final Color color, @Nullable final Color backgroundColor, @NotNull final String text) {
00082 super(tooltipManager, elementListener, name, text, font, color, backgroundPicture, backgroundColor);
00083 }
00084
00088 @Override
00089 protected void textChanged() {
00090 autoResize();
00091 setChanged();
00092 }
00093
00100 public void setAutoResize(final boolean autoResize) {
00101 if (this.autoResize != autoResize) {
00102 this.autoResize = autoResize;
00103 autoResize();
00104 }
00105 }
00106
00110 @Override
00111 public void paintComponent(@NotNull final Graphics g) {
00112 super.paintComponent(g);
00113
00114 final Font font = getTextFont();
00115 final Color color = getTextColor();
00116 g.setFont(font);
00117 g.setColor(color);
00118
00119 final Reader reader = new StringReader(getText());
00120 final HTMLEditorKit.ParserCallback renderer = new InternalHTMLRenderer(font, color, g, 0, font.getSize(), autoResize ? AUTO_BORDER_SIZE : 0);
00121 final ParserDelegator parserDelegator = new ParserDelegator();
00122 try {
00123 parserDelegator.parse(reader, renderer, false);
00124 } catch (final IOException ex) {
00125 System.err.println("GUIHTMLLabel: cannot render HTML: "+ex.getMessage());
00126 System.err.println(getText());
00127 }
00128 }
00129
00133 private void autoResize() {
00134 if (!autoResize) {
00135 return;
00136 }
00137
00138 final FontMetrics fontMetrics = getFontMetrics(getTextFont());
00139
00140 int width = 0;
00141 int height = 0;
00142 for (final String str : PATTERN_LINE_BREAK.split(getText(), -1)) {
00143 final Dimension size = GuiUtils.getTextDimension(str, fontMetrics);
00144 width = Math.max(width, size.width);
00145 height += size.height;
00146 }
00147 setSize(Math.max(1, width+2*AUTO_BORDER_SIZE), Math.max(1, height+2*AUTO_BORDER_SIZE));
00148 }
00149
00153 @Nullable
00154 @Override
00155 public Dimension getPreferredSize() {
00156 return new Dimension(100, 32);
00157 }
00158
00162 @Nullable
00163 @Override
00164 public Dimension getMinimumSize() {
00165 return new Dimension(100, 32);
00166 }
00167
00168 }