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.log;
00023
00024 import java.awt.Color;
00025 import java.awt.Font;
00026 import java.awt.Graphics;
00027 import java.awt.font.FontRenderContext;
00028 import java.awt.font.LineMetrics;
00029 import java.awt.geom.RectangularShape;
00030 import org.jetbrains.annotations.NotNull;
00031 import org.jetbrains.annotations.Nullable;
00032
00038 public class TextSegment extends AbstractSegment {
00039
00043 @NotNull
00044 private final String text;
00045
00049 private final boolean bold;
00050
00054 private final boolean italic;
00055
00059 private final boolean underline;
00060
00064 @NotNull
00065 private final FontID font;
00066
00070 @Nullable
00071 private final Color color;
00072
00077 private int underlineOffset = 0;
00078
00088 public TextSegment(@NotNull final String text, final boolean bold, final boolean italic, final boolean underline, @NotNull final FontID font, @Nullable final Color color) {
00089 this.text = text;
00090 this.bold = bold;
00091 this.italic = italic;
00092 this.underline = underline;
00093 this.font = font;
00094 this.color = color;
00095 }
00096
00101 @NotNull
00102 public String getText() {
00103 return text;
00104 }
00105
00111 @NotNull
00112 private Font getFont(@NotNull final Fonts fonts) {
00113 switch (font) {
00114 case PRINT:
00115 return fonts.getFontPrint();
00116
00117 case FIXED:
00118 return bold ? fonts.getFontFixedBold() : fonts.getFontFixed();
00119
00120 case ARCANE:
00121 return fonts.getFontArcane();
00122
00123 case HAND:
00124 return fonts.getFontPrint();
00125
00126 case STRANGE:
00127 return fonts.getFontPrint();
00128 }
00129
00130 throw new AssertionError();
00131 }
00132
00136 @Override
00137 public void draw(@NotNull final Graphics g, final int y, @NotNull final Fonts fonts) {
00138 g.setColor(color);
00139 g.setFont(getFont(fonts));
00140 final int segmentX = getX();
00141 final int segmentY = getY();
00142 g.drawString(text, segmentX, y+segmentY);
00143 if (underline) {
00144 g.drawLine(segmentX, y+segmentY+underlineOffset, segmentX+getWidth()-1, y+segmentY+underlineOffset);
00145 }
00146 }
00147
00151 @Override
00152 public void updateAttributes(@NotNull final Fonts fonts, @NotNull final FontRenderContext context) {
00153 final LineMetrics lineMetrics = getFont(fonts).getLineMetrics(text, context);
00154 underlineOffset = Math.round(lineMetrics.getUnderlineOffset());
00155 }
00156
00160 @NotNull
00161 @Override
00162 public RectangularShape getSize(@NotNull final Fonts fonts, @NotNull final FontRenderContext context) {
00163 return getFont(fonts).getStringBounds(text, context);
00164 }
00165
00175 public boolean matches(final boolean bold, final boolean italic, final boolean underline, @NotNull final FontID font, @Nullable final Color color) {
00176 return this.bold == bold && this.italic == italic && this.underline == underline && this.font == font && this.color == color;
00177 }
00178
00182 @NotNull
00183 @Override
00184 public String toString() {
00185 final StringBuilder sb = new StringBuilder();
00186 sb.append("segment:");
00187 if (bold) {
00188 sb.append("(bold)");
00189 }
00190 if (italic) {
00191 sb.append("(italic)");
00192 }
00193 if (underline) {
00194 sb.append("(underline)");
00195 }
00196 if (font != FontID.PRINT) {
00197 sb.append('(').append(font.toString().toLowerCase()).append(')');
00198 }
00199 if (color != null) {
00200 sb.append('(').append(Parser.toString(color)).append(')');
00201 }
00202 sb.append(text);
00203 sb.append('\n');
00204 return sb.toString();
00205 }
00206
00207 }