1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.scenegraph.g2d.nodes;
14 import java.awt.BasicStroke;
\r
15 import java.awt.Color;
\r
16 import java.awt.Graphics2D;
\r
17 import java.awt.geom.AffineTransform;
\r
18 import java.awt.geom.Rectangle2D;
\r
20 import org.simantics.scenegraph.g2d.G2DNode;
\r
21 import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;
\r
22 import org.simantics.scenegraph.utils.GridUtils;
\r
25 * @author Tuukka Lehtonen
\r
27 public class GridNode extends G2DNode {
30 * Used for naming and identifying (see {@link #setLookupId(String)})
\r
31 * GridNode instances in scene graphs.
\r
33 public static final String GRID_NODE_ID = "grid";
\r
35 private static final long serialVersionUID = -624916761394994358L;
\r
37 protected Boolean enabled = true;
\r
39 protected Color gridColor = new Color(0.9f, 0.9f, 0.9f);
\r
41 protected double gridSize = 1.0;
\r
43 protected ISnapAdvisor snapAdvisor;
\r
45 private transient final BasicStroke stroke = new BasicStroke(1);
\r
47 @SyncField("enabled")
\r
48 public void setEnabled(Boolean enabled) {
\r
49 this.enabled = enabled;
\r
52 @SyncField("gridColor")
\r
53 public void setGridColor(Color color) {
\r
54 this.gridColor = color;
\r
57 @SyncField("gridSize")
\r
58 public void setGridSize(double gridSize) {
\r
59 if (gridSize < 1e-6)
\r
61 this.gridSize = gridSize;
\r
64 @SyncField("snapAdvisor")
\r
65 public void setSnapAdvisor(ISnapAdvisor snapAdvisor) {
\r
66 this.snapAdvisor = snapAdvisor;
\r
69 public double getGridSize() {
\r
73 public ISnapAdvisor getSnapAdvisor() {
\r
78 public void render(Graphics2D g2d) {
82 AffineTransform ot = g2d.getTransform();
\r
84 double scaleX = Math.abs(ot.getScaleX());
85 double scaleY = Math.abs(ot.getScaleY());
86 if (scaleX <= 0 || scaleY <= 0) {
87 // Make sure that we don't end up in an eternal loop below.
91 double offsetX = ot.getTranslateX();
92 double offsetY = ot.getTranslateY();
93 g2d.setTransform(new AffineTransform());
95 //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
96 g2d.setStroke(stroke);
\r
97 if (gridColor != null)
\r
98 g2d.setColor(gridColor);
100 Rectangle2D bounds = g2d.getClipBounds();
101 if (bounds == null)
\r
107 //System.out.println("scales : " + scaleX + ", " + scaleY);
\r
109 stepX = GridUtils.limitedEvenGridSpacing(stepX, scaleX, 100, gridSize, true);
\r
110 stepY = GridUtils.limitedEvenGridSpacing(stepY, scaleY, 100, gridSize, true);
\r
112 //System.out.println("steps 1: " + stepX + ", " + stepY);
\r
114 while(stepX * scaleX < 50) stepX *= 2;
115 while(stepY * scaleY < 50) stepY *= 2;
117 //System.out.println("steps 2: " + stepX + ", " + stepY);
\r
119 if (stepX < gridSize*5)
\r
120 stepX = gridSize*5;
\r
121 if (stepY < gridSize*5)
\r
122 stepY = gridSize*5;
\r
124 //System.out.println("steps 2.1: " + stepX + ", " + stepY);
\r
129 //System.out.println("steps 3: " + stepX + ", " + stepY);
\r
134 //System.out.println("steps 4: " + stepX + ", " + stepY);
\r
136 for(double x = offsetX%stepX; x < bounds.getMaxX(); x+=stepX) {
137 g2d.drawLine((int)x, (int)bounds.getMinY(), (int)x, (int)bounds.getMaxY());
140 for(double y = offsetY%stepY; y < bounds.getMaxY(); y+=stepY) {
141 g2d.drawLine((int)bounds.getMinX(), (int)y, (int)bounds.getMaxX(), (int)y);
144 g2d.setTransform(ot);
148 public Rectangle2D getBoundsInLocal() {