import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import org.simantics.db.WriteGraph;
import org.simantics.db.common.request.WriteRequest;
import org.simantics.db.exception.DatabaseException;
+import org.simantics.diagram.elements.DiagramNodeUtil;
import org.simantics.diagram.ui.DiagramModelHints;
+import org.simantics.district.network.ModelledCRS;
import org.simantics.district.network.ui.DNEdgeBuilder;
import org.simantics.district.network.ui.NetworkDrawingParticipant;
import org.simantics.g2d.canvas.Hints;
+import org.simantics.g2d.canvas.ICanvasContext;
import org.simantics.g2d.canvas.IToolMode;
import org.simantics.g2d.diagram.IDiagram;
import org.simantics.scenegraph.g2d.G2DNode;
import org.simantics.scenegraph.g2d.events.EventTypes;
+import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
import org.simantics.scenegraph.g2d.events.MouseEvent;
import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
private static final long serialVersionUID = -3475301184009620573L;
+ private Point2D currentMousePos = null;
+
private List<Point2D> nodes = new ArrayList<>();
private Resource diagramResource;
@Override
public void render(Graphics2D g2d) {
+ if (nodes.isEmpty())
+ return;
Path2D path = new Path2D.Double();
Iterator<Point2D> nodeIter = nodes.iterator();
Point2D node = nodeIter.next();
path.lineTo(node.getX(), node.getY());
}
+ if (currentMousePos != null)
+ path.lineTo(currentMousePos.getX(), currentMousePos.getY());
Color old = g2d.getColor();
Stroke oldStroke = g2d.getStroke();
@Override
public int getEventMask() {
- return EventTypes.MouseMask;
+ return EventTypes.AnyMask;
}
@Override
while (nodeIter.hasNext()) {
if (end == null) {
start = nodeIter.next();
+ if (!nodeIter.hasNext()) {
+ break;
+ }
} else {
start = end;
}
+
end = nodeIter.next();
createEdge(start, end);
}
return super.mouseDoubleClicked(e);
}
-
+
private void createEdge(Point2D start, Point2D end) {
- double[] startCoords = new double[] { start.getX(), start.getY() };
- double[] endCoords = new double[] { end.getX(), end.getY() };
+
+ double currentPadding = DistrictNetworkVertexNode.width;
+ AffineTransform test = getTransform();
+ ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(this);
+ AffineTransform tr = ctx.getHintStack().getHint(Hints.KEY_CANVAS_TRANSFORM);
+ AffineTransform testing = new AffineTransform(tr);
+ testing.concatenate(test);
+ double calculateScaleRecip = DistrictNetworkNodeUtils.calculateScaleRecip(testing);
+ double padding = currentPadding * calculateScaleRecip;
+ /*
+ * To convert y-coordinates to map coordinates in ruler, use:
+ * double val = (y-offsetY)/scaleY;
+ * val = Math.toDegrees(Math.atan(Math.sinh(Math.toRadians(val))));
+ * String str = formatValue(val);
+ */
+ // TODO: fix scale
+ double scaleY = getTransform().getScaleY();
+ double scaleX = getTransform().getScaleX();
+
+ double startLat = ModelledCRS.yToLatitude(-start.getY() / scaleY);
+ double startLon = ModelledCRS.xToLongitude(start.getX() / scaleX);
+
+ double endLat = ModelledCRS.yToLatitude(-end.getY() / scaleY);
+ double endLon = ModelledCRS.xToLongitude(end.getX() / scaleX);
+
+ double[] startCoords = new double[] { startLon, startLat };
+ double[] endCoords = new double[] { endLon, endLat };
DNEdgeBuilder builder = new DNEdgeBuilder(diagramResource, diagram);
Simantics.getSession().asyncRequest(new WriteRequest() {
@Override
public void perform(WriteGraph graph) throws DatabaseException {
- builder.create(graph, startCoords, endCoords);
+ builder.create(graph, startCoords, 0, endCoords, 0, padding);
}
});
}
-
+
@Override
protected boolean mouseClicked(MouseClickEvent e) {
// check ToolMode
committed = false;
return false;
}
- Point2D localPos = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
- nodes.add(new Point2D.Double(localPos.getX(), localPos.getY()));
-
+ if (e.button == MouseEvent.RIGHT_BUTTON && !nodes.isEmpty()) {
+ nodes.remove(nodes.size() - 1);
+ } else if (e.button == MouseEvent.LEFT_BUTTON) {
+ Point2D localPos = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
+ nodes.add(new Point2D.Double(localPos.getX(), localPos.getY()));
+ }
repaint();
return true;
}
@Override
protected boolean mouseMoved(MouseMovedEvent e) {
+ IToolMode mode = getToolMode();
+ if (mode == Hints.CONNECTTOOL || e.hasAnyModifier(MouseEvent.ALT_MASK | MouseEvent.ALT_GRAPH_MASK)) {
+ boolean repaint = false;
+ Point2D p = NodeUtil.worldToLocal(this, e.controlPosition, new Point2D.Double());
+ if (participant.pickHoveredElement(p)) {
+ repaint = true;
+ }
+ if (!nodes.isEmpty()) {
+ currentMousePos = p;
+
+ repaint();
+ return true;
+ }
+ currentMousePos = null;
+ if (repaint == true)
+ repaint();
+ }
return super.mouseMoved(e);
}
+
+ @Override
+ protected boolean keyPressed(KeyPressedEvent e) {
+ if (e.keyCode == java.awt.event.KeyEvent.VK_ESCAPE) {
+ nodes.clear();
+ repaint();
+ return true;
+ }
+ return super.keyPressed(e);
+
+ }
}
\ No newline at end of file