/**
*
* Copyright (c) 2009-2016 Freedomotic team http://freedomotic.com
*
* This file is part of Freedomotic
*
* This Program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2, or (at your option) any later version.
*
* This Program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* Freedomotic; see the file COPYING. If not, see
* <http://www.gnu.org/licenses/>.
*/
package com.freedomotic.jfrontend;
import com.freedomotic.api.Protocol;
import com.freedomotic.app.Freedomotic;
import com.freedomotic.environment.ZoneLogic;
import com.freedomotic.events.ObjectReceiveClick;
import com.freedomotic.model.geometry.FreedomPoint;
import com.freedomotic.things.EnvObjectLogic;
import com.freedomotic.util.TopologyUtils;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Shape;
import java.util.Queue;
/**
*
* @author Enrico Nicoletti
*/
public class PlainDrawer
extends Renderer {
private Color PERIMETRAL_WALLS_COLOR = Color.black;
private Color PERIMETRAL_WALLS_COLOR_DARK = Color.black;
private Color PERIMETRAL_WALLS_COLOR_LIGHT = Color.black;
private Color INTERNAL_WALLS_COLOR = Color.black;
private Color INTERNAL_WALLS_COLOR_DARK = Color.black;
private int PERIMETRAL_WALLS_TICKNESS = 15;
private int INTERNAL_WALLS_TICKNESS = 3;
private int ENVIRONMENT_SHADOW_OFFSET = 10;
private Color ENVIRONMENT_SHADOW_COLOR = backgroundColor.darker();
Protocol master;
/**
*
* @param master
*/
public PlainDrawer(JavaDesktopFrontend master) {
super(master);
this.master = master;
}
/**
*
*/
@Override
public void prepareBackground() {
}
/**
*
*/
@Override
public void prepareForeground() {
//the line that delimits the internal shape of the environment (walls excuded)
// getContext().setColor(Color.black);
// Polygon poly = Freedomotic.environment.getShape();
// getContext().drawPolygon(poly);
}
/**
*
*/
@Override
public void renderEnvironment() {
Polygon poly = (Polygon) TopologyUtils.convertToAWT(getCurrEnv().getPojo().getShape());
// System.out.println("Shape: "+Freedomotic.environment.getShape());
// System.out.println("Polygon: "+poly);
Graphics2D g2 = (Graphics2D) getContext();
//render fake shadow
getContext().translate(ENVIRONMENT_SHADOW_OFFSET, ENVIRONMENT_SHADOW_OFFSET);
final BasicStroke stroke3 = new BasicStroke(50.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER);
g2.setStroke(stroke3);
getContext().setColor(ENVIRONMENT_SHADOW_COLOR);
g2.fillPolygon(poly);
int offset = (ENVIRONMENT_SHADOW_OFFSET / 4) * 3;
getContext().translate(-offset, -offset);
//external border of perimetral wall
final BasicStroke stroke4
= new BasicStroke(PERIMETRAL_WALLS_TICKNESS, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER);
g2.setStroke(stroke4);
getContext().setColor(PERIMETRAL_WALLS_COLOR_LIGHT);
g2.drawPolygon(poly);
//center of perimetral wall
final BasicStroke stroke
= new BasicStroke(PERIMETRAL_WALLS_TICKNESS / 10, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER);
g2.setStroke(stroke);
//internal of perimetral wall
getContext().setColor(PERIMETRAL_WALLS_COLOR);
g2.drawPolygon(poly);
final BasicStroke stroke2
= new BasicStroke(PERIMETRAL_WALLS_TICKNESS / 4, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER);
g2.setStroke(stroke2);
getContext().setColor(PERIMETRAL_WALLS_COLOR_DARK);
g2.drawPolygon(poly);
g2.setStroke(new BasicStroke()); //reset to default stroke
}
/**
*
*/
@Override
public void renderWalls() {
}
/**
*
*/
@Override
public void renderObjects() {
for (EnvObjectLogic obj : master.getApi().things().findByEnvironment(getCurrEnv())) {
if (obj != null) {
setTransformContextFor(obj.getPojo());
drawPlainObject(obj);
invalidateAnyTransform();
}
}
}
private void drawTrace(int[] xTrace, int[] yTrace, Color color) {
getContext().setColor(color);
int num = (int) Math.min(xTrace.length, yTrace.length);
getContext().drawPolyline(xTrace, yTrace, num);
}
private int[] getXTrace(Queue<FreedomPoint> trace) {
int size = trace.size();
int[] xPoints = new int[size];
int i = 0;
for (FreedomPoint p : trace) {
if (i < size) {
xPoints[i] = (int) p.getX();
i++;
}
}
return xPoints;
}
private int[] getYTrace(Queue<FreedomPoint> trace) {
int size = trace.size();
int[] yPoints = new int[size];
int i = 0;
for (FreedomPoint p : trace) {
if (i < size) {
yPoints[i] = (int) p.getY();
i++;
}
}
return yPoints;
}
/**
*
*/
@Override
public void renderZones() {
for (ZoneLogic zone : getCurrEnv().getZones()) {
if (zone != null) {
getContext().drawPolygon((Polygon) TopologyUtils.convertToAWT(zone.getPojo().getShape()));
}
}
}
/**
*
* @param poly
*/
protected void drawRoomObject(Polygon poly) {
Graphics2D g2 = (Graphics2D) getContext();
g2.setColor(Color.green);
g2.setStroke(new BasicStroke()); //reset to default stroke
g2.draw(poly);
Color walls = INTERNAL_WALLS_COLOR;
getContext().setColor(walls);
g2.drawPolygon(poly);
final BasicStroke stroke2
= new BasicStroke(INTERNAL_WALLS_TICKNESS, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER);
g2.setStroke(stroke2);
Color walls2 = INTERNAL_WALLS_COLOR_DARK;
getContext().setColor(walls2);
g2.drawPolygon(poly);
g2.setStroke(new BasicStroke()); //reset to default stroke
}
/**
*
* @param obj
*/
protected void drawPlainObject(EnvObjectLogic obj) {
Graphics2D graph2D = (Graphics2D) getContext();
//rebuildShapeCache(obj);
//Shape shape = getCachedShape(obj);
Shape shape = TopologyUtils.convertToAWT(obj.getPojo().getCurrentRepresentation().getShape());
Color fill = Color.decode(obj.getPojo().getCurrentRepresentation().getFillColor());
Color border = Color.decode(obj.getPojo().getCurrentRepresentation().getBorderColor());
if (fill != null) {
graph2D.setColor(fill);
graph2D.fill(shape);
}
if (border != null) {
graph2D.setColor(border);
graph2D.draw(shape);
} else {
graph2D.setColor(Color.black);
graph2D.draw(shape);
}
}
/**
*
* @param obj
*/
@Override
public void mouseEntersObject(EnvObjectLogic obj) {
}
/**
*
* @param obj
*/
@Override
public void mouseExitsObject(EnvObjectLogic obj) {
}
/**
*
* @param obj
*/
@Override
public void mouseClickObject(EnvObjectLogic obj) {
ObjectReceiveClick event = new ObjectReceiveClick(this, obj, ObjectReceiveClick.SINGLE_CLICK);
Freedomotic.sendEvent(event);
}
/**
*
* @param obj
*/
@Override
public void mouseDoubleClickObject(EnvObjectLogic obj) {
ObjectReceiveClick event = new ObjectReceiveClick(this, obj, ObjectReceiveClick.DOUBLE_CLICK);
Freedomotic.sendEvent(event);
}
/**
*
* @param obj
*/
@Override
public void mouseRightClickObject(EnvObjectLogic obj) {
ObjectReceiveClick event = new ObjectReceiveClick(this, obj, ObjectReceiveClick.RIGHT_CLICK);
Freedomotic.sendEvent(event);
openObjEditor(obj);
}
}