/*
* 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.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import com.t3.client.AppStyle;
import com.t3.client.TabletopTool;
import com.t3.client.ui.zone.ZoneRenderer;
import com.t3.model.Zone;
import com.t3.model.drawing.Drawable;
import com.t3.model.drawing.DrawableColorPaint;
import com.t3.model.drawing.LineSegment;
import com.t3.model.drawing.Pen;
import com.t3.model.drawing.ShapeDrawable;
import com.t3.util.guidreference.ZoneReference;
/**
* Tool for drawing freehand lines.
*/
public class PolygonTopologyTool extends LineTool implements MouseMotionListener {
private static final long serialVersionUID = 3258132466219627316L;
public PolygonTopologyTool() {
try {
setIcon(new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("com/t3/client/image/tool/top-blue-poly.png"))));
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@Override
// Override abstracttool to prevent color palette from
// showing up
protected void attachTo(ZoneRenderer renderer) {
super.attachTo(renderer);
// Hide the drawable color palette
TabletopTool.getFrame().hideControlPanel();
}
@Override
public boolean isAvailable() {
return TabletopTool.getPlayer().isGM();
}
@Override
protected boolean drawMeasurement() {
return false;
}
@Override
public String getTooltip() {
return "tool.polytopo.tooltip";
}
@Override
public String getInstructions() {
return "tool.poly.instructions";
}
@Override
protected boolean isBackgroundFill(MouseEvent e) {
return true;
}
@Override
protected void completeDrawable(ZoneReference zone, Pen pen, Drawable drawable) {
Area area = new Area();
if (drawable instanceof LineSegment) {
LineSegment line = (LineSegment) drawable;
BasicStroke stroke = new BasicStroke(pen.getThickness(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
Path2D path = new Path2D.Double();
Point lastPoint = null;
for (Point point : line.getPoints()) {
if (path.getCurrentPoint() == null)
{
path.moveTo(point.x, point.y);
} else if (!point.equals(lastPoint)) {
path.lineTo(point.x, point.y);
lastPoint = point;
}
}
area.add(new Area(stroke.createStrokedShape(path)));
} else {
area = new Area(((ShapeDrawable) drawable).getShape());
}
if (pen.isEraser()) {
renderer.getZone().removeTopology(area);
TabletopTool.serverCommand().removeTopology(renderer.getZone().getId(), area);
} else {
renderer.getZone().addTopology(area);
TabletopTool.serverCommand().addTopology(renderer.getZone().getId(), area);
}
renderer.repaint();
}
@Override
protected Pen getPen() {
Pen pen = new Pen(TabletopTool.getFrame().getPen());
pen.setEraser(isEraser());
pen.setForegroundMode(Pen.MODE_TRANSPARENT);
pen.setBackgroundMode(Pen.MODE_SOLID);
pen.setThickness(1.0f);
pen.setPaint(new DrawableColorPaint(isEraser() ? AppStyle.topologyRemoveColor : AppStyle.topologyAddColor));
return pen;
}
@Override
protected Polygon getPolygon(LineSegment line) {
Polygon polygon = new Polygon();
for (Point point : line.getPoints()) {
polygon.addPoint(point.x, point.y);
}
return polygon;
}
@Override
public void paintOverlay(ZoneRenderer renderer, Graphics2D g) {
if (TabletopTool.getPlayer().isGM()) {
Zone zone = renderer.getZone();
Area topology = zone.getTopology();
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(renderer.getViewOffsetX(), renderer.getViewOffsetY());
g2.scale(renderer.getScale(), renderer.getScale());
g2.setColor(AppStyle.topologyColor);
g2.fill(topology);
g2.dispose();
}
super.paintOverlay(renderer, g);
}
}