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.item;
00023
00024 import com.realtime.crossfire.jxclient.items.CfItem;
00025 import com.realtime.crossfire.jxclient.util.MathUtils;
00026 import java.awt.Color;
00027 import java.awt.Dimension;
00028 import java.awt.Font;
00029 import java.awt.Graphics;
00030 import java.awt.Graphics2D;
00031 import java.awt.Image;
00032 import java.awt.geom.RectangularShape;
00033 import org.jetbrains.annotations.NotNull;
00034 import org.jetbrains.annotations.Nullable;
00035
00040 public class ItemPainter {
00041
00045 private static final int TEXT_OFFSET = 3;
00046
00050 @Nullable
00051 private final Image cursedImage;
00052
00056 @Nullable
00057 private final Image damnedImage;
00058
00062 @Nullable
00063 private final Image magicImage;
00064
00068 @Nullable
00069 private final Image blessedImage;
00070
00074 @Nullable
00075 private final Image appliedImage;
00076
00080 @Nullable
00081 private final Image unidentifiedImage;
00082
00086 @Nullable
00087 private final Image selectorImage;
00088
00092 @Nullable
00093 private final Image lockedImage;
00094
00098 @Nullable
00099 private final Image unpaidImage;
00100
00104 @Nullable
00105 private final Color cursedColor;
00106
00110 @Nullable
00111 private final Color damnedColor;
00112
00116 @Nullable
00117 private final Color magicColor;
00118
00122 @Nullable
00123 private final Color blessedColor;
00124
00128 @Nullable
00129 private final Color appliedColor;
00130
00134 @Nullable
00135 private final Color unidentifiedColor;
00136
00140 @Nullable
00141 private final Color selectorColor;
00142
00146 @Nullable
00147 private final Color lockedColor;
00148
00152 @Nullable
00153 private final Color unpaidColor;
00154
00158 @NotNull
00159 private final Font font;
00160
00164 @NotNull
00165 private final Color nrofColor;
00166
00190 public ItemPainter(@Nullable final Image cursedImage, @Nullable final Image damnedImage, @Nullable final Image magicImage, @Nullable final Image blessedImage, @Nullable final Image appliedImage, @Nullable final Image unidentifiedImage, @Nullable final Image selectorImage, @Nullable final Image lockedImage, @Nullable final Image unpaidImage, @Nullable final Color cursedColor, @Nullable final Color damnedColor, @Nullable final Color magicColor, @Nullable final Color blessedColor, @Nullable final Color appliedColor, @Nullable final Color unidentifiedColor, @Nullable final Color selectorColor, @Nullable final Color lockedColor, @Nullable final Color unpaidColor, @NotNull final Font font, @NotNull final Color nrofColor) {
00191 this.cursedImage = cursedImage;
00192 this.damnedImage = damnedImage;
00193 this.magicImage = magicImage;
00194 this.blessedImage = blessedImage;
00195 this.appliedImage = appliedImage;
00196 this.unidentifiedImage = unidentifiedImage;
00197 this.selectorImage = selectorImage;
00198 this.lockedImage = lockedImage;
00199 this.unpaidImage = unpaidImage;
00200 this.cursedColor = cursedColor;
00201 this.damnedColor = damnedColor;
00202 this.magicColor = magicColor;
00203 this.blessedColor = blessedColor;
00204 this.appliedColor = appliedColor;
00205 this.unidentifiedColor = unidentifiedColor;
00206 this.selectorColor = selectorColor;
00207 this.lockedColor = lockedColor;
00208 this.unpaidColor = unpaidColor;
00209 this.font = font;
00210 this.nrofColor = nrofColor;
00211 }
00212
00218 @NotNull
00219 public ItemPainter newItemPainter() {
00220 return new ItemPainter(cursedImage, damnedImage, magicImage, blessedImage, appliedImage, unidentifiedImage, selectorImage, lockedImage, unpaidImage, cursedColor, damnedColor, magicColor, blessedColor, appliedColor, unidentifiedColor, selectorColor, lockedColor, unpaidColor, font, nrofColor);
00221 }
00222
00227 @NotNull
00228 public Dimension getMinimumSize() {
00229 final Dimension dimension = new Dimension(32, 32);
00230 updateMinimumSize(dimension, appliedImage);
00231 updateMinimumSize(dimension, unidentifiedImage);
00232 updateMinimumSize(dimension, cursedImage);
00233 updateMinimumSize(dimension, magicImage);
00234 updateMinimumSize(dimension, blessedImage);
00235 updateMinimumSize(dimension, lockedImage);
00236 updateMinimumSize(dimension, unpaidImage);
00237 return dimension;
00238 }
00239
00245 private static void updateMinimumSize(@NotNull final Dimension minimumSize, @Nullable final Image image) {
00246 if (image == null) {
00247 return;
00248 }
00249
00250 final int width = image.getWidth(null);
00251 if (minimumSize.width < width) {
00252 minimumSize.width = width;
00253 }
00254
00255 final int height = image.getWidth(null);
00256 if (minimumSize.height < height) {
00257 minimumSize.height = height;
00258 }
00259 }
00260
00270 public void paint(@NotNull final Graphics2D g, @NotNull final CfItem item, final boolean selected, @NotNull final Image face, final int w, final int h) {
00271 paintColor(g, appliedColor, item.isApplied(), w, h);
00272 paintColor(g, unidentifiedColor, item.isUnidentified(), w, h);
00273 paintColor(g, cursedColor, item.isCursed(), w, h);
00274 paintColor(g, damnedColor, item.isDamned(), w, h);
00275 paintColor(g, magicColor, item.isMagic(), w, h);
00276 paintColor(g, blessedColor, item.isBlessed(), w, h);
00277 paintColor(g, lockedColor, item.isLocked(), w, h);
00278 paintColor(g, selectorColor, selected, w, h);
00279 paintColor(g, unpaidColor, item.isUnpaid(), w, h);
00280 final int imageW = Math.max(0, face.getWidth(null));
00281 final int imageH = Math.max(0, face.getHeight(null));
00282 final int scaledW;
00283 final int scaledH;
00284 final int offsetX;
00285 final int offsetY;
00286 if (imageW > imageH) {
00287 scaledW = h;
00288 scaledH = MathUtils.divRound(imageH*h, imageW);
00289 offsetX = 0;
00290 offsetY = (h-scaledH)/2;
00291 } else {
00292 scaledW = MathUtils.divRound(imageW*h, imageH);
00293 scaledH = h;
00294 offsetX = (h-scaledW)/2;
00295 offsetY = 0;
00296 }
00297 g.drawImage(face, offsetX, offsetY, scaledW, scaledH, null);
00298 paintImage(g, appliedImage, item.isApplied());
00299 paintImage(g, unidentifiedImage, item.isUnidentified());
00300 paintImage(g, cursedImage, item.isCursed());
00301 paintImage(g, damnedImage, item.isDamned());
00302 paintImage(g, magicImage, item.isMagic());
00303 paintImage(g, blessedImage, item.isBlessed());
00304 paintImage(g, lockedImage, item.isLocked());
00305 paintImage(g, selectorImage, selected);
00306 paintImage(g, unpaidImage, item.isUnpaid());
00307 if (w <= h) {
00308 if (item.getNrOf() > 1) {
00309 g.setFont(font);
00310 g.setColor(nrofColor);
00311 g.drawString(String.valueOf(item.getNrOf()), 1, 1+font.getSize());
00312 }
00313 } else {
00314 g.setFont(font);
00315 g.setColor(nrofColor);
00316 g.setBackground(new Color(0, 0, 0, 0.0f));
00317 renderText(g, TEXT_OFFSET+h, 0, h/2, item.getTooltipText1());
00318 renderText(g, TEXT_OFFSET+h, h/2, h/2, item.getTooltipText2());
00319 }
00320 }
00321
00330 private static void paintColor(@NotNull final Graphics g, @Nullable final Color color, final boolean isActive, final int w, final int h) {
00331 if (isActive && color != null) {
00332 g.setColor(color);
00333 g.fillRect(0, 0, w, h);
00334 }
00335 }
00336
00343 private static void paintImage(@NotNull final Graphics g, @Nullable final Image image, final boolean isActive) {
00344 if (isActive) {
00345 g.drawImage(image, 0, 0, null);
00346 }
00347 }
00348
00357 private void renderText(@NotNull final Graphics2D g, final int dx, final int dy, final int height, @NotNull final String text) {
00358 final RectangularShape rectangle = font.getStringBounds(text, g.getFontRenderContext());
00359 final int y = dy+(int)Math.round(height-rectangle.getMaxY()-rectangle.getMinY())/2;
00360 g.drawString(text, dx, y);
00361 }
00362
00363 }