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.Graphics2D;
00033 import java.awt.image.BufferedImage;
00034 import java.util.regex.Pattern;
00035 import org.jetbrains.annotations.NotNull;
00036 import org.jetbrains.annotations.Nullable;
00037
00043 public class GUIMultiLineLabel extends GUILabel {
00044
00048 private static final long serialVersionUID = 1;
00049
00053 @NotNull
00054 private static final Pattern LINE_SEPARATOR_PATTERN = Pattern.compile(" *\n");
00055
00059 @NotNull
00060 private String[] lines;
00061
00074 public GUIMultiLineLabel(@NotNull final TooltipManager tooltipManager, @NotNull final GUIElementListener elementListener, @NotNull final String name, @Nullable final BufferedImage picture, @NotNull final Font font, @NotNull final Color color, @Nullable final Color backgroundColor, @NotNull final Alignment alignment, @NotNull final String text) {
00075 super(tooltipManager, elementListener, name, picture, text, font, color, backgroundColor, alignment);
00076 lines = LINE_SEPARATOR_PATTERN.split(getText(), -1);
00077 }
00078
00082 @Override
00083 protected void textChanged() {
00084 lines = LINE_SEPARATOR_PATTERN.split(getText(), -1);
00085 super.textChanged();
00086 }
00087
00091 @Override
00092 public void paintComponent(@NotNull final Graphics g) {
00093 super.paintComponent(g);
00094
00095 if (lines.length <= 0) {
00096 return;
00097 }
00098
00099 final Graphics2D g2 = (Graphics2D)g;
00100 final Dimension rectangle = GuiUtils.getTextDimension("Xg", getFontMetrics(getTextFont()));
00101 final int lineHeight = rectangle.height;
00102
00103 int y = 0;
00104 for (final String line : lines) {
00105 drawLine(g2, y, lineHeight, line);
00106 y += lineHeight;
00107 }
00108 }
00109
00113 @Nullable
00114 @Override
00115 public Dimension getPreferredSize() {
00116 return getTextSize();
00117 }
00118
00122 @Nullable
00123 @Override
00124 public Dimension getMinimumSize() {
00125 return getTextSize();
00126 }
00127
00133 @NotNull
00134 private Dimension getTextSize() {
00135 final FontMetrics fontMetrics = getFontMetrics(getTextFont());
00136
00137 int width = 0;
00138 for (final String line : lines) {
00139 final Dimension dimension = GuiUtils.getTextDimension(line, fontMetrics);
00140 if (width < dimension.width) {
00141 width = dimension.width;
00142 }
00143 }
00144
00145 final Dimension rectangle = GuiUtils.getTextDimension("Xg", fontMetrics);
00146 final int height = lines.length*rectangle.height;
00147
00148 return new Dimension(width, height);
00149 }
00150
00151 }