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;
\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
22 import org.simantics.scenegraph.g2d.G2DNode;
\r
23 import org.simantics.scenegraph.utils.GeometryUtils;
\r
26 * @author Tuukka Lehtonen
\r
28 public class PageBorderNode extends G2DNode {
\r
30 private static final long serialVersionUID = -5969105979396122487L;
\r
32 private static final Paint MARGIN_COLOR = new Color(192, 128, 128);
\r
34 protected Rectangle2D border = null;
\r
35 protected Rectangle2D margin = null;
\r
36 protected Boolean enabled = null;
\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
46 @SyncField("enabled")
\r
47 public void setEnabled(Boolean enabled) {
\r
48 this.enabled = enabled;
\r
52 public Rectangle2D getBounds() {
\r
61 public void render(Graphics2D g) {
\r
62 if (Boolean.FALSE.equals(enabled))
\r
65 boolean borderPaintable = isPaintable(border);
\r
66 boolean marginPaintable = isPaintable(margin);
\r
67 if (!borderPaintable && !marginPaintable)
\r
70 double scaleRecip = 1 / GeometryUtils.getScale(g.getTransform());
\r
71 Stroke s = new BasicStroke((float) (1 * scaleRecip));
\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
80 if (marginPaintable && (!borderPainted || !margin.equals(border))) {
\r
81 paintRectangle(g, scaleRecip, margin, s, MARGIN_COLOR, null, null);
\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
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
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
112 public Rectangle2D getBoundsInLocal() {
\r
117 public String toString() {
\r
118 return super.toString() + " [enabled=" + enabled + ", border=" + border + ", margin=" + margin + "]";
\r