]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SelectionNode.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / SelectionNode.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License v1.0
6  * which accompanies this distribution, and is available at
7  * http://www.eclipse.org/legal/epl-v10.html
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.scenegraph.g2d.nodes;
13
14 import java.awt.BasicStroke;
15 import java.awt.Color;
16 import java.awt.Graphics2D;
17 import java.awt.geom.AffineTransform;
18 import java.awt.geom.Rectangle2D;
19
20 import org.simantics.scenegraph.g2d.G2DNode;
21 import org.simantics.scenegraph.utils.GeometryUtils;
22
23 public class SelectionNode extends G2DNode implements Decoration {
24     /**
25      * 
26      */
27     private static final long serialVersionUID = -2879575230419873230L;
28
29     public transient static final BasicStroke SELECTION_STROKE = new BasicStroke(1.0f,
30             BasicStroke.CAP_SQUARE, BasicStroke.CAP_SQUARE, 10.0f,
31             new float[] { 5.0f, 5.0f }, 0.0f);
32
33     protected Rectangle2D bounds = null;
34     protected Color color = null;
35     protected transient Rectangle2D rect;
36     protected transient BasicStroke scaledStroke;
37     protected transient double previousScaleRecip = Double.NaN;
38
39     @SyncField({"transform", "bounds", "color"})
40     public void init(AffineTransform transform, Rectangle2D bounds, Color color) {
41         this.transform = transform;
42         this.bounds = bounds;
43         this.color = color;
44     }
45
46     @Override
47     public void render(Graphics2D g) {
48         if (bounds == null) return;
49
50         // Prevent exceptions during rendering.
51         if (transform.getDeterminant() == 0)
52             return;
53
54         AffineTransform ot = g.getTransform();
55
56         g.setColor(color);
57         g.transform(transform);
58
59         AffineTransform tx = g.getTransform();
60         //System.out.println("tx: " + tx);
61         double scale = GeometryUtils.getScale(tx);
62         //System.out.println("scale: " + scale);
63         double scaleRecip = 1.0 / scale;
64         //System.out.println("scale: " + scaleRecip);
65
66         // Prevent stroke reallocation while panning.
67         // Zooming will trigger reallocation.
68         if (scaledStroke == null || scaleRecip != previousScaleRecip) {
69             scaledStroke = GeometryUtils.scaleStroke( SELECTION_STROKE, (float) scaleRecip);
70             previousScaleRecip = scaleRecip;
71         }
72         g.setStroke(scaledStroke);
73
74         double padding = 5.0 * scaleRecip;
75         double paddingX = padding;
76         double paddingY = padding;
77
78         if (rect == null)
79             rect = new Rectangle2D.Double();
80         rect.setFrame(bounds.getMinX() - paddingX, bounds.getMinY() - paddingY,
81                 bounds.getWidth() + 2.0*paddingX, bounds.getHeight() + 2.0*paddingY);
82         g.draw(rect);
83         
84         g.setTransform(ot);
85
86     }
87
88     @Override
89     public Rectangle2D getBoundsInLocal() {
90         return bounds;
91     }
92 }