/* * Copyright (c) 2014 tabletoptool.com team. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * rptools.com team - initial implementation * tabletoptool.com team - further development */ package com.t3.client.ui.zone; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.SwingUtilities; import com.t3.client.ScreenPoint; import com.t3.image.ImageUtil; import com.t3.model.Pointer; import com.t3.model.Zone; import com.t3.model.ZonePoint; import com.t3.util.GraphicsUtil; /** * Draws the various "pointer" shapes that users can call up using Spacebar/Ctrl+Spacebar/Shift+Spacebar. The * paintOverlay() method is called by ZoneRenderer.renderTokens() and no one else. */ public class PointerOverlay implements ZoneOverlay { private final List<PointerPair> pointerList = new ArrayList<PointerPair>(); private static BufferedImage POINTER_IMAGE; private static BufferedImage SPEECH_IMAGE; private static BufferedImage THOUGHT_IMAGE; static { try { POINTER_IMAGE = ImageUtil.getCompatibleImage("com/t3/client/image/arrow.png"); SPEECH_IMAGE = ImageUtil.getCompatibleImage("com/t3/client/image/speech.png"); THOUGHT_IMAGE = ImageUtil.getCompatibleImage("com/t3/client/image/thought.png"); } catch (IOException ioe) { ioe.printStackTrace(); } } @Override public void paintOverlay(ZoneRenderer renderer, Graphics2D g) { Zone zone = renderer.getZone(); for (int i = 0; i < pointerList.size(); i++) { PointerPair p = pointerList.get(i); if (p.pointer.getZoneReference().getId().equals(zone.getId())) { ZonePoint zPoint = new ZonePoint(p.pointer.getX(), p.pointer.getY()); ScreenPoint sPoint = ScreenPoint.fromZonePointRnd(renderer, zPoint.x, zPoint.y); int offX = 0; int offY = 0; int centX = 0; int centY = 0; BufferedImage image = null; switch (p.pointer.getType()) { case ARROW: image = POINTER_IMAGE; offX = 2; offY = -36; break; case SPEECH_BUBBLE: offX = -19; offY = -61; centX = 36; centY = 23; image = SPEECH_IMAGE; break; case THOUGHT_BUBBLE: offX = -13; offY = -65; centX = 36; centY = 23; image = THOUGHT_IMAGE; break; } g.drawImage(image, (int) sPoint.x + offX, (int) sPoint.y + offY, null); switch (p.pointer.getType()) { case ARROW: GraphicsUtil.drawBoxedString(g, p.player, (int) sPoint.x + POINTER_IMAGE.getWidth() - 10, (int) sPoint.y - POINTER_IMAGE.getHeight() + 15, SwingUtilities.LEFT); break; case THOUGHT_BUBBLE: case SPEECH_BUBBLE: FontMetrics fm = renderer.getFontMetrics(renderer.getFont()); String name = p.player; int len = SwingUtilities.computeStringWidth(fm, name); g.setColor(Color.black); int x = (int) sPoint.x + centX + offX + 5; int y = (int) sPoint.y + offY + centY + fm.getHeight() / 2; g.drawString(name, x - len / 2, y); break; } } } } public void addPointer(String player, Pointer pointer) { pointerList.add(new PointerPair(player, pointer)); } public void removePointer(String player) { for (int i = 0; i < pointerList.size(); i++) { if (pointerList.get(i).player.equals(player)) { pointerList.remove(i); } } } public Pointer getPointer(String player) { for (int i = 0; i < pointerList.size(); i++) { if (pointerList.get(i).player.equals(player)) { return pointerList.get(i).pointer; } } return null; } private class PointerPair { Pointer pointer; String player; PointerPair(String player, Pointer pointer) { this.pointer = pointer; this.player = player; } } }