]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/GridNode.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / GridNode.java
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
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.scenegraph.g2d.nodes;
13
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
19 \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
23
24 /**\r
25  * @author Tuukka Lehtonen\r
26  */\r
27 public class GridNode extends G2DNode {
28 \r
29     /**\r
30      * Used for naming and identifying (see {@link #setLookupId(String)})\r
31      * GridNode instances in scene graphs.\r
32      */\r
33     public static final String          GRID_NODE_ID     = "grid";\r
34     \r
35     private static final long           serialVersionUID = -624916761394994358L;\r
36 \r
37     protected Boolean                   enabled          = true;\r
38 \r
39     protected Color                     gridColor        = new Color(0.9f, 0.9f, 0.9f);\r
40 \r
41     protected double                    gridSize         = 1.0;\r
42 \r
43     protected ISnapAdvisor              snapAdvisor;\r
44 \r
45     private transient final BasicStroke stroke           = new BasicStroke(1);\r
46 \r
47     @SyncField("enabled")\r
48     public void setEnabled(Boolean enabled) {\r
49         this.enabled = enabled;\r
50     }\r
51 \r
52     @SyncField("gridColor")\r
53     public void setGridColor(Color color) {\r
54         this.gridColor = color;\r
55     }\r
56 \r
57     @SyncField("gridSize")\r
58     public void setGridSize(double gridSize) {\r
59         if (gridSize < 1e-6)\r
60             gridSize = 1e-6;\r
61         this.gridSize = gridSize;\r
62     }\r
63 \r
64     @SyncField("snapAdvisor")\r
65     public void setSnapAdvisor(ISnapAdvisor snapAdvisor) {\r
66         this.snapAdvisor = snapAdvisor;\r
67     }\r
68 \r
69     public double getGridSize() {\r
70         return gridSize;\r
71     }\r
72 \r
73     public ISnapAdvisor getSnapAdvisor() {\r
74         return snapAdvisor;\r
75     }\r
76
77     @Override
78     public void render(Graphics2D g2d) {
79         if (!enabled)\r
80             return;\r
81 \r
82         AffineTransform ot = g2d.getTransform();\r
83         
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.
88             return;
89         }\r
90
91         double offsetX = ot.getTranslateX();
92         double offsetY = ot.getTranslateY();
93         g2d.setTransform(new AffineTransform());
94
95         //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
96         g2d.setStroke(stroke);\r
97         if (gridColor != null)\r
98             g2d.setColor(gridColor);
99
100         Rectangle2D bounds = g2d.getClipBounds();
101         if (bounds == null)\r
102             return; // FIXME
103
104         double stepX = 50;
105         double stepY = 50;
106 \r
107         //System.out.println("scales : " + scaleX + ", " + scaleY);\r
108 \r
109         stepX = GridUtils.limitedEvenGridSpacing(stepX, scaleX, 100, gridSize, true);\r
110         stepY = GridUtils.limitedEvenGridSpacing(stepY, scaleY, 100, gridSize, true);\r
111 \r
112         //System.out.println("steps 1: " + stepX + ", " + stepY);\r
113 \r
114         while(stepX * scaleX < 50) stepX *= 2;
115         while(stepY * scaleY < 50) stepY *= 2;
116 \r
117         //System.out.println("steps 2: " + stepX + ", " + stepY);\r
118 \r
119         if (stepX < gridSize*5)\r
120             stepX = gridSize*5;\r
121         if (stepY < gridSize*5)\r
122             stepY = gridSize*5;\r
123 \r
124         //System.out.println("steps 2.1: " + stepX + ", " + stepY);\r
125
126         stepX *= scaleX;
127         stepY *= scaleY;
128 \r
129         //System.out.println("steps 3: " + stepX + ", " + stepY);\r
130
131         stepX /= 5;
132         stepY /= 5;
133 \r
134         //System.out.println("steps 4: " + stepX + ", " + stepY);\r
135
136         for(double x = offsetX%stepX; x < bounds.getMaxX(); x+=stepX) {
137             g2d.drawLine((int)x, (int)bounds.getMinY(), (int)x, (int)bounds.getMaxY());
138         }
139
140         for(double y = offsetY%stepY; y < bounds.getMaxY(); y+=stepY) {
141             g2d.drawLine((int)bounds.getMinX(), (int)y, (int)bounds.getMaxX(), (int)y);
142         }
143
144         g2d.setTransform(ot);
145     }
146 \r
147     @Override
148     public Rectangle2D getBoundsInLocal() {
149         return null;
150     }
151
152 }