/* * 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.tool.drawing; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.SwingUtilities; import com.t3.client.ScreenPoint; import com.t3.model.CellPoint; import com.t3.model.ZonePoint; import com.t3.model.drawing.AbstractTemplate; import com.t3.model.drawing.LineTemplate; import com.t3.model.drawing.WallTemplate; import com.t3.swing.SwingUtil; /** * A tool to draw a wall template for 4e D&D * * @author Jay */ public class WallTemplateTool extends BurstTemplateTool { /*--------------------------------------------------------------------------------------------- * Constructors *-------------------------------------------------------------------------------------------*/ /** * Set the icon for the base tool. */ public WallTemplateTool() { try { setIcon(new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream( "com/t3/client/image/tool/temp-blue-wall.png")))); } catch (IOException ioe) { ioe.printStackTrace(); } // endtry } /*--------------------------------------------------------------------------------------------- * Overridden RadiusTemplateTool methods *-------------------------------------------------------------------------------------------*/ /** * @see com.t3.client.tool.drawing.RadiusTemplateTool#createBaseTemplate() */ @Override protected AbstractTemplate createBaseTemplate() { return new WallTemplate(); } /** * @see com.t3.client.ui.Tool#getTooltip() */ @Override public String getTooltip() { return "tool.walltemplate.tooltip"; } /** * @see com.t3.client.ui.Tool#getInstructions() */ @Override public String getInstructions() { return "tool.walltemplate.instructions"; } /** * @see com.t3.client.tool.drawing.RadiusTemplateTool#mousePressed(java.awt.event.MouseEvent) */ @Override public void mousePressed(MouseEvent e) { if (!painting) return; // Set up the path when the anchor is pressed. if (SwingUtilities.isLeftMouseButton(e) && !anchorSet) { LineTemplate lt = ((LineTemplate) template); lt.clearPath(); ArrayList<CellPoint> path = new ArrayList<CellPoint>(); path.add(lt.getPointFromPool(0, 0)); lt.setPath(path); } // endif super.mousePressed(e); } /** * @see com.t3.client.tool.drawing.RadiusTemplateTool#handleMouseMovement(java.awt.event.MouseEvent) */ @Override protected void handleMouseMovement(MouseEvent e) { // Set the anchor ZonePoint vertex = template.getVertex(); if (!anchorSet) { setCellAtMouse(e, vertex); controlOffset = null; // Move the anchor if control pressed. } else if (SwingUtil.isControlDown(e)) { handleControlOffset(e, vertex); // Add or delete a new cell } else { // Get mouse point as an offset from the vertex LineTemplate lt = ((LineTemplate) template); ZonePoint mouse = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer); CellPoint mousePoint = renderer.getZone().getGrid().convert(mouse); CellPoint vertexPoint = renderer.getZone().getGrid().convert(lt.getVertex()); mousePoint.x = mousePoint.x - vertexPoint.x; mousePoint.y = mousePoint.y - vertexPoint.y; // Compare to the second to last point, if == delete last point List<CellPoint> path = lt.getPath(); CellPoint lastPoint = path.get(path.size() - 1); int dx = mousePoint.x - lastPoint.x; int dy = mousePoint.y - lastPoint.y; if (dx != 0 && dy == 0 || dy != 0 && dx == 0) { int count = Math.max(Math.abs(dy), Math.abs(dx)); dx = dx == 0 ? 0 : dx / Math.abs(dx); dy = dy == 0 ? 0 : dy / Math.abs(dy); for (int i = 1; i <= count; i++) { CellPoint current = lt.getPointFromPool(lastPoint.x + dx * i, lastPoint.y + dy * i); if (path.size() > 1 && path.get(path.size() - 2).equals(current)) { lt.addPointToPool(path.remove(path.size() - 1)); lt.addPointToPool(current); } else { path.add(current); } // endif } // endfor } // endif renderer.repaint(); controlOffset = null; } // endif } /** * @see com.t3.client.tool.drawing.RadiusTemplateTool#resetTool() */ @Override protected void resetTool() { super.resetTool(); ((WallTemplate) template).clearPath(); } }