]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/PageBorderNode.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / PageBorderNode.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;\r
13 \r
14 import java.awt.BasicStroke;\r
15 import java.awt.Color;\r
16 import java.awt.Graphics2D;\r
17 import java.awt.Paint;\r
18 import java.awt.Stroke;\r
19 import java.awt.geom.Line2D;\r
20 import java.awt.geom.Rectangle2D;\r
21 \r
22 import org.simantics.scenegraph.g2d.G2DNode;\r
23 import org.simantics.scenegraph.utils.GeometryUtils;\r
24 \r
25 /**\r
26  * @author Tuukka Lehtonen\r
27  */\r
28 public class PageBorderNode extends G2DNode {\r
29 \r
30     private static final long  serialVersionUID = -5969105979396122487L;\r
31 \r
32     private static final Paint MARGIN_COLOR     = new Color(192, 128, 128);\r
33 \r
34     protected Rectangle2D      border           = null;\r
35     protected Rectangle2D      margin           = null;\r
36     protected Boolean          enabled          = null;\r
37 \r
38     @SyncField( { "border", "margin", "enabled" })\r
39     public void init(Rectangle2D border, Rectangle2D margin, Boolean enabled) {\r
40         //System.out.println("PageBorderNode.init(" + border + ", " + margin + ", " + enabled);\r
41         this.border = border;\r
42         this.margin = margin;\r
43         this.enabled = enabled;\r
44     }\r
45 \r
46     @SyncField("enabled")\r
47     public void setEnabled(Boolean enabled) {\r
48         this.enabled = enabled;\r
49     }\r
50 \r
51     @Override\r
52     public Rectangle2D getBounds() {\r
53         if (border != null)\r
54             return border;\r
55         if (margin != null)\r
56             return margin;\r
57         return null;\r
58     }\r
59 \r
60     @Override\r
61     public void render(Graphics2D g) {\r
62         if (Boolean.FALSE.equals(enabled))\r
63             return;\r
64 \r
65         boolean borderPaintable = isPaintable(border);\r
66         boolean marginPaintable = isPaintable(margin);\r
67         if (!borderPaintable && !marginPaintable)\r
68             return;\r
69 \r
70         double scaleRecip = 1 / GeometryUtils.getScale(g.getTransform());\r
71         Stroke s = new BasicStroke((float) (1 * scaleRecip));\r
72 \r
73         boolean borderPainted = false;\r
74         if (borderPaintable) {\r
75             Stroke ss = new BasicStroke((float) (2 * scaleRecip));\r
76             paintRectangle(g, scaleRecip, border, s, Color.BLACK, ss, Color.GRAY);\r
77             borderPainted = true;\r
78         }\r
79 \r
80         if (marginPaintable && (!borderPainted || !margin.equals(border))) {\r
81             paintRectangle(g, scaleRecip, margin, s, MARGIN_COLOR, null, null);\r
82         }\r
83     }\r
84 \r
85     boolean isPaintable(Rectangle2D r) {\r
86         return r != null && !r.isEmpty() && r.getWidth() != Double.POSITIVE_INFINITY\r
87         && r.getHeight() != Double.POSITIVE_INFINITY;\r
88     }\r
89 \r
90     void paintRectangle(Graphics2D g, double scaleRecip, Rectangle2D r, Stroke stroke, Paint strokePaint,\r
91             Stroke shadowStroke, Paint shadowPaint) {\r
92         g.setPaint(strokePaint);\r
93         g.setStroke(stroke);\r
94         g.draw(r);\r
95 \r
96         if (shadowStroke != null) {\r
97             g.setPaint(shadowPaint);\r
98             g.setStroke(shadowStroke);\r
99             double offset = 2 * scaleRecip;\r
100             double w = r.getWidth();\r
101             double h = r.getHeight();\r
102             double x = r.getMaxX() + offset;\r
103             double x1 = r.getMinX() + offset * 2;\r
104             double y1 = r.getMinY() + offset * 2;\r
105             g.draw(new Line2D.Double(x, y1, x, y1 + h - offset));\r
106             double y = r.getMaxY() + offset;\r
107             g.draw(new Line2D.Double(x1, y, x1 + w - offset, y));\r
108         }\r
109     }\r
110 \r
111     @Override\r
112     public Rectangle2D getBoundsInLocal() {\r
113         return border;\r
114     }\r
115 \r
116     @Override\r
117     public String toString() {\r
118         return super.toString() + " [enabled=" + enabled + ", border=" + border + ", margin=" + margin + "]";\r
119     }\r
120 \r
121 }\r