Crossfire JXClient, Trunk
GUIHTMLLabel.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.gui.label;
24 
30 import java.awt.Color;
31 import java.awt.Dimension;
32 import java.awt.Font;
33 import java.awt.FontMetrics;
34 import java.awt.Graphics;
35 import java.awt.image.BufferedImage;
36 import java.io.IOException;
37 import java.io.Reader;
38 import java.io.StringReader;
39 import java.util.regex.Pattern;
40 import javax.swing.text.html.HTMLEditorKit.ParserCallback;
41 import javax.swing.text.html.parser.ParserDelegator;
42 import org.jetbrains.annotations.NotNull;
43 import org.jetbrains.annotations.Nullable;
44 
49 public class GUIHTMLLabel extends AbstractLabel {
50 
54  private static final long serialVersionUID = 1;
55 
59  private static final int AUTO_BORDER_SIZE = 2;
60 
64  @NotNull
65  private static final Pattern PATTERN_LINE_BREAK = Pattern.compile("<br>");
66 
70  private boolean autoResize;
71 
85  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, @NotNull final GuiFactory guiFactory) {
86  super(tooltipManager, elementListener, name, text, font, color, color, backgroundPicture, backgroundColor, guiFactory);
87  }
88 
89  @Override
90  protected void textChanged() {
91  autoResize();
92  super.textChanged();
93  setChanged();
94  }
95 
102  public void setAutoResize(final boolean autoResize) {
103  if (this.autoResize != autoResize) {
104  this.autoResize = autoResize;
105  autoResize();
106  }
107  }
108 
109  @Override
110  public void paintComponent(@NotNull final Graphics g) {
111  super.paintComponent(g);
112 
113  final Font font = getTextFont();
114  final Color color = getTextColor();
115  g.setFont(font);
116  g.setColor(color);
117 
118  final Reader reader = new StringReader(getText());
119  final ParserCallback renderer = new InternalHTMLRenderer(font, color, g, 0, font.getSize(), autoResize ? AUTO_BORDER_SIZE : 0);
120  final ParserDelegator parserDelegator = new ParserDelegator();
121  try {
122  parserDelegator.parse(reader, renderer, false);
123  } catch (final IOException ex) {
124  System.err.println("GUIHTMLLabel: cannot render HTML: "+ex.getMessage());
125  System.err.println(getText());
126  }
127  }
128 
132  private void autoResize() {
133  if (!autoResize) {
134  return;
135  }
136 
137  final FontMetrics fontMetrics = getFontMetrics(getTextFont());
138 
139  int width = 0;
140  int height = 0;
141  for (String str : PATTERN_LINE_BREAK.split(getText(), -1)) {
142  final Dimension size = GuiUtils.getTextDimension(str, fontMetrics);
143  width = Math.max(width, size.width);
144  height += size.height;
145  }
146  setSize(Math.max(1, width+2*AUTO_BORDER_SIZE), Math.max(1, height+2*AUTO_BORDER_SIZE));
147  }
148 
149  @Nullable
150  @Override
151  @SuppressWarnings("MethodDoesntCallSuperMethod")
152  public Dimension getPreferredSize() {
153  return new Dimension(100, 32); // XXX
154  }
155 
156  @Nullable
157  @Override
158  @SuppressWarnings("MethodDoesntCallSuperMethod")
159  public Dimension getMinimumSize() {
160  return new Dimension(100, 32); // XXX
161  }
162 
163  @Override
164  public void notifyOpen() {
165  }
166 
167  @Nullable
168  @Override
170  return null;
171  }
172 
173 }
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.name
final String name
Definition: AbstractGUIElement.java:77
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.skin.skin
Definition: DefaultJXCSkin.java:23
com.realtime.crossfire.jxclient.gui.label.AbstractLabel
Definition: AbstractLabel.java:43
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel
Definition: GUIHTMLLabel.java:49
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.GUIHTMLLabel
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, @NotNull final GuiFactory guiFactory)
Definition: GUIHTMLLabel.java:85
com.realtime.crossfire.jxclient.gui.label.AbstractLabel.text
String text
Definition: AbstractLabel.java:54
com.realtime.crossfire.jxclient.skin
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.paintComponent
void paintComponent(@NotNull final Graphics g)
Definition: GUIHTMLLabel.java:110
com.realtime.crossfire.jxclient.skin.skin.GuiFactory
Definition: GuiFactory.java:41
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.autoResize
void autoResize()
Definition: GUIHTMLLabel.java:132
com.realtime.crossfire.jxclient.gui.gui.GuiUtils.getTextDimension
static Dimension getTextDimension(@NotNull final String text, @NotNull final FontMetrics fontMetrics)
Definition: GuiUtils.java:50
com.realtime.crossfire.jxclient.gui.gui.GuiUtils
Definition: GuiUtils.java:34
com.realtime.crossfire.jxclient.gui.label.InternalHTMLRenderer
Definition: InternalHTMLRenderer.java:38
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.textChanged
void textChanged()
Definition: GUIHTMLLabel.java:90
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.PATTERN_LINE_BREAK
static final Pattern PATTERN_LINE_BREAK
Definition: GUIHTMLLabel.java:65
com.realtime.crossfire.jxclient.gui.label.AbstractLabel.getTextColor
Color getTextColor()
Definition: AbstractLabel.java:169
com.realtime.crossfire.jxclient.gui.label.AbstractLabel.getTextFont
Font getTextFont()
Definition: AbstractLabel.java:160
com.realtime.crossfire.jxclient.gui.label.AbstractLabel.backgroundColor
final Color backgroundColor
Definition: AbstractLabel.java:85
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.autoResize
boolean autoResize
Definition: GUIHTMLLabel.java:70
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.getPreferredSize
Dimension getPreferredSize()
Definition: GUIHTMLLabel.java:152
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.elementListener
final GUIElementListener elementListener
Definition: AbstractGUIElement.java:89
com.realtime.crossfire.jxclient.gui.gui.TooltipManager
Definition: TooltipManager.java:33
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.getMinimumSize
Dimension getMinimumSize()
Definition: GUIHTMLLabel.java:159
com.realtime.crossfire.jxclient.gui.gui
Definition: AbstractGUIElement.java:23
com.realtime.crossfire.jxclient.gui.gui.TooltipText
Definition: TooltipText.java:31
com.realtime.crossfire
com.realtime
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.setAutoResize
void setAutoResize(final boolean autoResize)
Definition: GUIHTMLLabel.java:102
com
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.getTooltip
TooltipText getTooltip()
Definition: GUIHTMLLabel.java:169
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.setChanged
void setChanged()
Definition: AbstractGUIElement.java:223
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.guiFactory
final GuiFactory guiFactory
Definition: AbstractGUIElement.java:48
com.realtime.crossfire.jxclient.gui.label.AbstractLabel.getText
String getText()
Definition: AbstractLabel.java:151
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.serialVersionUID
static final long serialVersionUID
Definition: GUIHTMLLabel.java:54
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.notifyOpen
void notifyOpen()
Definition: GUIHTMLLabel.java:164
com.realtime.crossfire.jxclient.gui.gui.GUIElementListener
Definition: GUIElementListener.java:32
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.tooltipManager
final TooltipManager tooltipManager
Definition: AbstractGUIElement.java:83
com.realtime.crossfire.jxclient.gui.label.GUIHTMLLabel.AUTO_BORDER_SIZE
static final int AUTO_BORDER_SIZE
Definition: GUIHTMLLabel.java:59