package org.archstudio.bna.things.utility;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.ICoordinate;
import org.archstudio.bna.ICoordinateMapper;
import org.archstudio.bna.constants.GridDisplayType;
import org.archstudio.bna.things.AbstractThingPeer;
import org.archstudio.bna.ui.IUIResources;
import org.archstudio.swtutils.constants.LineStyle;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
public class GridThingPeer<T extends GridThing> extends AbstractThingPeer<T> {
public GridThingPeer(T thing, IBNAView view, ICoordinateMapper cm) {
super(thing, view, cm);
}
@Override
public boolean draw(Rectangle localBounds, IUIResources r) {
// only draw for the top level things
if (view.getParentView() != null) {
return false;
}
GridDisplayType gridDisplayType = t.getGridDisplayType();
if (gridDisplayType == GridDisplayType.NONE) {
return false;
}
if (t.getGridSpacing() == 0) {
return false;
}
long worldGridStep = t.getGridSpacing();
while (worldGridStep * cm.getLocalScale() <= 8) {
worldGridStep *= 2;
}
RGB color = t.getEdgeColor();
if (color != null) {
Rectangle lClip = new Rectangle(localBounds.x, localBounds.y, localBounds.width, localBounds.height);
Point2D tl = cm.localToWorld(new Point2D.Double(localBounds.x, localBounds.y));
Point2D br = cm.localToWorld(
new Point2D.Double(localBounds.x + localBounds.width, localBounds.y + localBounds.height));
long wx = Math.round(tl.getX());
long wy = Math.round(tl.getY());
long wx2 = Math.round(br.getX());
long wy2 = Math.round(br.getY());
long dx = wx % worldGridStep;
long dy = wy % worldGridStep;
if (gridDisplayType == GridDisplayType.SOLID_LINES || gridDisplayType == GridDisplayType.DOTTED_LINES) {
for (long i = wx - dx; i <= wx2; i += worldGridStep) {
double gx = cm.worldToLocal(new Point2D.Double(i, wy)).getX();
r.drawShape(new Line2D.Double(gx, lClip.y, gx, lClip.y + lClip.height), color, 1,
gridDisplayType.getLineStyle(), 1);
}
for (long i = wy - dy; i <= wy2; i += worldGridStep) {
double gy = cm.worldToLocal(new Point2D.Double(wx, i)).getY();
r.drawShape(new Line2D.Double(lClip.x, gy, lClip.x + lClip.width, gy), color, 1,
gridDisplayType.getLineStyle(), 1);
}
}
else if (gridDisplayType == GridDisplayType.DOTS_AT_CORNERS) {
Point2D.Double point = new Point2D.Double();
for (long i = wx - dx; i <= wx2; i += worldGridStep) {
double gx = cm.worldToLocal(new Point2D.Double(i, wy)).getX();
for (long j = wy - dy; j <= wy2; j += worldGridStep) {
double gy = cm.worldToLocal(new Point2D.Double(wx, j)).getY();
point.x = gx;
point.y = gy;
r.drawShape(point, color, 1);
}
}
}
else if (gridDisplayType == GridDisplayType.CROSSES_AT_CORNERS) {
for (long i = wx - dx; i <= wx2; i += worldGridStep) {
double gx = cm.worldToLocal(new Point2D.Double(i, wy)).getX();
for (long j = wy - dy; j <= wy2; j += worldGridStep) {
double gy = cm.worldToLocal(new Point2D.Double(wx, j)).getY();
r.drawShape(new Line2D.Double(gx - 3, gy, gx + 3, gy), color, 1, LineStyle.SOLID, 1);
r.drawShape(new Line2D.Double(gx, gy - 3, gx, gy + 3), color, 1, LineStyle.SOLID, 1);
}
}
}
}
return true;
}
@Override
public boolean isInThing(ICoordinate location) {
return false;
}
}